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(); ???} ??}); ?} }
以上就是小編今天的分享,希望可以幫助到大家。