Java反射如何獲取字段屬性值
Java反射獲取字段屬性值
反射獲取Java類的所有字段,包括所有父類中的字段。 類自身的字段可直接通過方法
getDeclaredFields()【獲取所有修飾符字段】或者getFields()【獲取public修飾的字段】獲取, 但父類中的字段暫時沒有發(fā)現(xiàn)直接獲取的方式。
需要遞歸獲取所有的父類, 然后獲取他們的字段, 最終獲取到類的所有字段。
如果要獲取字段值, 則需要設(shè)置字段可訪問即: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); ? ?? ??? ?// 獲取當(dāng)前對象的所有屬性字段 ?? ??? ?// 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 -> { ? ?? ??? ??? ?// 設(shè)置字段可訪問, 否則無法訪問private修飾的變量值 ?? ??? ??? ?field.setAccessible(true); ?? ??? ??? ?try { ?? ??? ??? ??? ?// 獲取字段名稱 ?? ??? ??? ??? ?String fieldName = field.getName(); ? ?? ??? ??? ??? ?// 獲取指定對象的當(dāng)前字段的值 ?? ??? ??? ??? ?Object fieldVal = field.get(stu1); ?? ??? ??? ??? ?System.out.println(fieldName+"="+fieldVal); ?? ??? ??? ?} catch (IllegalAccessException e) { ?? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?} ?? ??? ?}); ?? ?} }
4. 結(jié)果輸出
反射對象獲取屬性和值憑借成string
描述
有些時候會用到把穿過來的對象用kv的形式拼接這個時候用反射就很不錯
直接上代碼
public class FanSeVo { ? ? private String name; ? ? private String id; ? ? //....... ? ? // 如果是跟外部程序或者接口對接的話,下面還可以加2個屬性,一個是相互約定的秘鑰,一個//是排除秘鑰之后對屬性和值做憑借之后的MD5加密之后的值,可以做數(shù)據(jù)安全考慮,防止傳輸過程數(shù)據(jù)被篡改 }
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 ? ? ? ? ? ? // 當(dāng)然中間還可做其他的業(yè)務(wù)操作,比如跳過某些屬性什么的 ? ? ? ? ? ? ? ? String name = field.getName(); ? ? ? ? ? ? ? ? String s = field.get(fanSeVo).toString(); ? ? ? ? ? ? ? ? map.put(name,s); ? ? ? ? ? ? ? ? System.out.println(); ? ? ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? // 吧map數(shù)據(jù)轉(zhuǎn)成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(); ? ? } }
總結(jié),其實(shí)反射也不難,遇到什么多寫幾遍就好了
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)oracle插入當(dāng)前時間的方法
這篇文章主要介紹了java實(shí)現(xiàn)oracle插入當(dāng)前時間的方法,以實(shí)例形式對比分析了java使用Oracle操作時間的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03Java實(shí)現(xiàn)迅雷地址轉(zhuǎn)成普通地址實(shí)例代碼
本篇文章主要介紹了Java實(shí)現(xiàn)迅雷地址轉(zhuǎn)成普通地址實(shí)例代碼,非常具有實(shí)用價值,有興趣的可以了解一下。2017-03-03