您好,登錄后才能下訂單哦!
今天小編給大家分享一下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. 結果輸出
有些時候會用到把穿過來的對象用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(); } }
以上就是“Java反射怎么獲取字段屬性值”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。