
java反射獲取屬性值是怎樣的呢?一起來看下吧:
反射獲取Java類的所有字段,包括所有父類中的字段。類自身的字段可直接通過方法getDeclaredFields()(獲取所有修飾符字段)或者getFields()(獲取public修飾的字段)獲取,但父類中的字段暫時沒有發現直接獲取的方式。 需要遞歸獲取所有的父類,然后獲取他們的字段,最終獲取到類的所有字段。?
如果要獲取字段值,則需要設置字段可訪問:field.setAccessible(true);? field為reflect包下的Field類
案例:
1、父類
package?com.carl.study.springboot.bean;
?
import?lombok.Data;
import?lombok.experimental.Accessors;
?
/**
?*?@author?changez
?*?@desc
?*?@date?2019/3/10?11:30
?*/
@Data
@Accessors(chain?=?true)
public?class?BeanBasic?{
?
?private?Integer?id;
?private?Long?createTime;
?private?Long?updateTime;
}2、子類
package?com.carl.study.springboot.bean;
?
import?lombok.Data;
import?lombok.EqualsAndHashCode;
import?lombok.ToString;
import?lombok.experimental.Accessors;
?
/**
?*?@author?changez
?*?@desc
?*?@date?2019/3/10?11:17
?*/
@Data
@EqualsAndHashCode(callSuper?=?true)
@ToString(callSuper?=?true)
@Accessors(chain?=?true)
public?class?Student?extends?BeanBasic{
?
?private?String?name;
?private?String?address;
}3、測試類
package?test.lombok;
?
import?com.carl.study.springboot.bean.Student;
import?org.junit.Test;
?
import?java.lang.reflect.Field;
import?java.util.ArrayList;
import?java.util.Arrays;
import?java.util.List;
?
/**
?*?@author?changez
?*?@desc?Java反射獲取類的所有屬性.
?*?@date?2019/3/10?11:41
?*/
public?class?LombokTest?{
?
?@Test
?public?void?getParentField(){
??Student?stu1?=?new?Student();
??stu1.setName("student-name")
???.setAddress("student1-address")
???.setId(1)
???.setCreateTime(20190310140423L)
???.setUpdateTime(20190310140423L)
??;
?
??Class?clazz?=?Student.class;
??List?allFields?=?new?ArrayList<>(100);
?
??//?獲取當前對象的所有屬性字段
??//?clazz.getFields():獲取public修飾的字段
??//?clazz.getDeclaredFields():?獲取所有的字段包括private修飾的字段
??allFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
?
??//?獲取所有父類的字段,?父類中的字段需要逐級獲取
??Class?clazzSuper?=?clazz.getSuperclass();
?
??//?如果父類不是object,表明其繼承的有其他類。?逐級獲取所有父類的字段
??while?(clazzSuper?!=?Object.class)?{
???allFields.addAll(Arrays.asList(clazzSuper.getDeclaredFields()));
???clazzSuper?=?clazzSuper.getSuperclass();
??}
?
??allFields.stream().forEach(field?->?{
?
???//?設置字段可訪問,?否則無法訪問private修飾的變量值
???field.setAccessible(true);
???try?{
????//?獲取字段名稱
????String?fieldName?=?field.getName();
?
????//?獲取指定對象的當前字段的值
????Object?fieldVal?=?field.get(stu1);
????System.out.println(fieldName+"="+fieldVal);
???}?catch?(IllegalAccessException?e)?{
????e.printStackTrace();
???}
??});
?}
}
以上就是小編今天的分享,希望可以幫助到大家。
