首頁 >Java >java教程 >如何使用Java反射取得物件欄位的屬性值?

如何使用Java反射取得物件欄位的屬性值?

王林
王林轉載
2023-04-22 23:01:143704瀏覽

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. 結果輸出

如何使用Java反射取得物件欄位的屬性值?

#反射物件取得屬性和值憑藉成string

描述

有些時候會用到把穿過來的物件用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反射取得物件欄位的屬性值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除