Java反射如何獲取字段屬性值
Java反射獲取字段屬性值
反射獲取Java類的所有字段,包括所有父類中的字段。 類自身的字段可直接通過方法
getDeclaredFields()【獲取所有修飾符字段】或者getFields()【獲取public修飾的字段】獲取, 但父類中的字段暫時(shí)沒有發(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. 測(cè)試類,獲取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)前對(duì)象的所有屬性字段 ?? ??? ?// clazz.getFields():獲取public修飾的字段 ?? ??? ?// clazz.getDeclaredFields(): 獲取所有的字段包括private修飾的字段 ?? ??? ?allFields.addAll(Arrays.asList(clazz.getDeclaredFields())); ? ?? ??? ?// 獲取所有父類的字段, 父類中的字段需要逐級(jí)獲取 ?? ??? ?Class clazzSuper = clazz.getSuperclass(); ? ?? ??? ?// 如果父類不是object,表明其繼承的有其他類。 逐級(jí)獲取所有父類的字段 ?? ??? ?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(); ? ?? ??? ??? ??? ?// 獲取指定對(duì)象的當(dāng)前字段的值 ?? ??? ??? ??? ?Object fieldVal = field.get(stu1); ?? ??? ??? ??? ?System.out.println(fieldName+"="+fieldVal); ?? ??? ??? ?} catch (IllegalAccessException e) { ?? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?} ?? ??? ?}); ?? ?} }
4. 結(jié)果輸出
反射對(duì)象獲取屬性和值憑借成string
描述
有些時(shí)候會(huì)用到把穿過來的對(duì)象用kv的形式拼接這個(gè)時(shí)候用反射就很不錯(cuò)
直接上代碼
public class FanSeVo { ? ? private String name; ? ? private String id; ? ? //....... ? ? // 如果是跟外部程序或者接口對(duì)接的話,下面還可以加2個(gè)屬性,一個(gè)是相互約定的秘鑰,一個(gè)//是排除秘鑰之后對(duì)屬性和值做憑借之后的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 { ? ? ? ? ? ? // 把對(duì)象的屬性做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í)反射也不難,遇到什么多寫幾遍就好了
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解基于MVC的數(shù)據(jù)查詢模塊進(jìn)行模糊查詢
這篇文章主要介紹了Java基于MVC的數(shù)據(jù)查詢模塊進(jìn)行模糊查詢,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01關(guān)于 Java 的數(shù)據(jù)結(jié)構(gòu)鏈表
這篇文章主要介紹了關(guān)于 Java 的數(shù)據(jù)結(jié)構(gòu)鏈表的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容2021-09-09java語言描述Redis分布式鎖的正確實(shí)現(xiàn)方式
這篇文章主要介紹了java語言描述Redis分布式鎖的正確實(shí)現(xiàn)方式,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12使用JWT作為Spring?Security?OAuth2的token存儲(chǔ)問題
這篇文章主要介紹了使用JWT作為Spring?Security?OAuth2的token存儲(chǔ),大家經(jīng)常使用的方法有兩種一種是使用JWT作為Token傳遞,一種是使用Redis存儲(chǔ)Token,資源服務(wù)器本地訪問Redis校驗(yàn)Token,需要的朋友可以參考下2021-12-12Java反射機(jī)制的學(xué)習(xí)總結(jié)
總的來說,java反射機(jī)制是一個(gè)很好用的東西,用它可以解決很多死的東西,因?yàn)榉瓷錂C(jī)制的靈活行很大,有了他,我們就不要花太多的時(shí)間來寫操做數(shù)據(jù)庫的代碼了,而是方法更多的時(shí)間在項(xiàng)目的邏輯功能上,這個(gè)可以很大的減少開發(fā)時(shí)間,而且代碼的可讀性好2013-09-09

Spring\SpringBoot配置連接數(shù)據(jù)庫的方法