Java反射如何獲取字段屬性值
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. 測試類,獲取student類的所有字段
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<Field> 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(); } }); } }
4. 結果輸出
反射對象獲取屬性和值憑借成string
描述
有些時候會用到把穿過來的對象用kv的形式拼接這個時候用反射就很不錯
直接上代碼
public class FanSeVo { private String name; private String id; //....... // 如果是跟外部程序或者接口對接的話,下面還可以加2個屬性,一個是相互約定的秘鑰,一個//是排除秘鑰之後對屬性和值做憑借之後的MD5加密之後的值,可以做數據安全考慮,防止傳輸過程數據被篡改 }
package com.ycj.my_all_demo.fanse; import java.lang.reflect.Field; import java.util.HashMap; /** * @author ycj * @data 17:55 */ public class FanSe { public static void main(String[] args) { FanSeVo fanSeVo = new FanSeVo("1", "2"); Field[] fields = fanSeVo.getClass().getDeclaredFields(); HashMap<String, String> map = new HashMap<>(); for (Field field : fields) { field.setAccessible(true); try { // 把對象的屬性做k,值做v // 當然中間還可做其他的業務操作,比如跳過某些屬性什麼的 String name = field.getName(); String s = field.get(fanSeVo).toString(); map.put(name,s); System.out.println(); } catch (Exception e) { e.printStackTrace(); } } // 吧map數據轉成str,kv的形式 String strByMap = getStrByMap(map); System.out.println(strByMap);//name1id2 } public static String getStrByMap(HashMap<String, String> map){ StringBuilder str = new StringBuilder(); map.forEach((k,v)->{str.append(k).append(v);}); return str.toString(); } }
總結,其實反射也不難,遇到什麼多寫幾遍就好瞭
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Java開發反射機制的實戰經驗總結
- java8如何根據某一屬性條件快速篩選list中的集合
- spring-data-elasticsearch @Field註解無效的完美解決方案
- Java如何通過反射獲取私有構造、私有對象、私有字段、私有方法
- java反射超詳細講解