欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java反射如何獲取字段屬性值

 更新時(shí)間:2022年07月08日 16:49:02   作者:changerzhuo  
這篇文章主要介紹了Java反射如何獲取字段屬性值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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)文章

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

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

    最近在學(xué)習(xí)SpringBoot,第一步就是要配置數(shù)據(jù)庫,本文詳細(xì)的介紹了Spring\SpringBoot配置連接數(shù)據(jù)庫的方法,有需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • 最新評(píng)論