通過反射設置父類屬性值

【簡介】

實際開發中有時候需要使用反射進行屬性賦值


【詳解】

package com.it.domain;

import lombok.Data;

@Data
public class Person {
    private String name;
    private int age;
}
package com.it.domain;

import lombok.Data;

@Data
public class Employe extends Person{
    private String team;
}

通過反射給屬性值賦值

package com.it.domain;

import com.alibaba.fastjson.JSON;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflexDemo {
    public static void main(String[] args) throws Exception {

        Class clazz = Employe.class;
        // 創建一個實體對象
        Object instance = clazz.newInstance();

        /**
         * 1 設置本類中的屬性
         */
        // 方式一:通過暴力反射 屬性名稱獲取屬性
        //Field field = clazz.getDeclaredField("team");
        //field.setAccessible(true);
        //field.set(instance, "飛虎隊");

        // 方式二:通過暴力反射 獲取set方法
        Method method = clazz.getDeclaredMethod("setTeam", String.class);
        method.invoke(instance,"戰狼隊");

        /**
         * 2 設置父類中的屬性
         */
        // 方式一:通過暴力反射 屬性名稱獲取屬性
        Field field = clazz.getSuperclass().getDeclaredField("age");
        field.setAccessible(true);
        field.set(instance, 23);

        // 方式二:通過暴力反射 獲取set方法
        //Method md = clazz.getSuperclass().getDeclaredMethod("setName", String.class);
        //md.invoke(instance,"張三");

        // 方式三:
        //使用符合JavaBean規範的屬性訪問器
        PropertyDescriptor pd = new PropertyDescriptor("name", clazz);
        //調用setter
        Method writeMethod = pd.getWriteMethod();    //setName()
        writeMethod.invoke(instance, "王五");


        System.out.println(JSON.toJSONString(instance));

    }
}

這裏爲了方便,使用main函數和控制檯打印

在這裏插入圖片描述
已經有值了!大功告成!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章