Java反射如何獲取字段屬性值
Java反射獲取字段屬性值
反射獲取Java類(lèi)的所有字段,包括所有父類(lèi)中的字段。 類(lèi)自身的字段可直接通過(guò)方法
getDeclaredFields()【獲取所有修飾符字段】或者getFields()【獲取public修飾的字段】獲取, 但父類(lèi)中的字段暫時(shí)沒(méi)有發(fā)現(xiàn)直接獲取的方式。
需要遞歸獲取所有的父類(lèi), 然后獲取他們的字段, 最終獲取到類(lèi)的所有字段。
如果要獲取字段值, 則需要設(shè)置字段可訪問(wèn)即:field.setAccessible(true); field為reflect包下的Field類(lèi)
案例
1. 父類(lèi)
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. 子類(lèi)
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è)試類(lèi),獲取student類(lèi)的所有字段
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反射獲取類(lèi)的所有屬性.
?* @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()));
?
?? ??? ?// 獲取所有父類(lèi)的字段, 父類(lèi)中的字段需要逐級(jí)獲取
?? ??? ?Class clazzSuper = clazz.getSuperclass();
?
?? ??? ?// 如果父類(lèi)不是object,表明其繼承的有其他類(lèi)。 逐級(jí)獲取所有父類(lèi)的字段
?? ??? ?while (clazzSuper != Object.class) {
?? ??? ??? ?allFields.addAll(Arrays.asList(clazzSuper.getDeclaredFields()));
?? ??? ??? ?clazzSuper = clazzSuper.getSuperclass();
?? ??? ?}
?
?? ??? ?allFields.stream().forEach(field -> {
?
?? ??? ??? ?// 設(shè)置字段可訪問(wèn), 否則無(wú)法訪問(wèn)private修飾的變量值
?? ??? ??? ?field.setAccessible(true);
?? ??? ??? ?try {
?? ??? ??? ??? ?// 獲取字段名稱(chēng)
?? ??? ??? ??? ?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ì)用到把穿過(guò)來(lái)的對(duì)象用kv的形式拼接這個(gè)時(shí)候用反射就很不錯(cuò)
直接上代碼
public class FanSeVo {
? ? private String name;
? ? private String id;
? ? //.......
? ? // 如果是跟外部程序或者接口對(duì)接的話,下面還可以加2個(gè)屬性,一個(gè)是相互約定的秘鑰,一個(gè)//是排除秘鑰之后對(duì)屬性和值做憑借之后的MD5加密之后的值,可以做數(shù)據(jù)安全考慮,防止傳輸過(guò)程數(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ù)操作,比如跳過(guò)某些屬性什么的
? ? ? ? ? ? ? ? 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í)反射也不難,遇到什么多寫(xiě)幾遍就好了
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)oracle插入當(dāng)前時(shí)間的方法
這篇文章主要介紹了java實(shí)現(xiàn)oracle插入當(dāng)前時(shí)間的方法,以實(shí)例形式對(duì)比分析了java使用Oracle操作時(shí)間的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
java后臺(tái)調(diào)用接口及處理跨域問(wèn)題的解決
這篇文章主要介紹了java后臺(tái)調(diào)用接口,處理跨域的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java實(shí)現(xiàn)迅雷地址轉(zhuǎn)成普通地址實(shí)例代碼
本篇文章主要介紹了Java實(shí)現(xiàn)迅雷地址轉(zhuǎn)成普通地址實(shí)例代碼,非常具有實(shí)用價(jià)值,有興趣的可以了解一下。2017-03-03
解決spring boot環(huán)境切換失效的問(wèn)題
這篇文章主要介紹了解決spring boot環(huán)境切換失效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

