【簡介】
實際開發中有時候需要使用反射進行屬性賦值
【詳解】
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函數和控制檯打印
已經有值了!大功告成!