<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>
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(); } }); }}