【Java】利用反射设置属性对象
文章目录
一、获取属性核心API
1 使用Class.forName设置类中属性
java
Class.forName("全路径包名") throws ClassNotFoundException // eg com.demo.MyClass
2 .class的方式
java
Class clazz = MyClass.class;
3 使用类对象的 getClass() 方法
java
MyClass myClazz = new MyClass();
Class clazz = myClazz.getClass();
4 ReflectionUtils获取属性,允许操作,设置值
java
Field field = ReflectionUtils.findField(targetClass, name, type); //获取属性对象
ReflectionUtils.makeAccessible(field); //允许操作
ReflectionUtils.setField(field, targetObject, value); //设置值
5 ReflectionTestUtils直接操作属性,内部封装了ReflectionUtils的api
java
MyClass myClazz = new MyClass();
ReflectionTestUtils.setField(myClazz,"myField","New Value");
二、测试代码
类环境准备
java
public class MyClass{
private String myField;
public String getMyField() {
return myField;
}
public void setMyField(String myField) {
this.myField = myField;
}
}
方法一设置属性demo
java
import java.lang.reflect.Field;
public class ReflectExample {
public static void main(String[] args) {
try {
// 使用 Class.forName 获取类对象 todo 替换掉xxx.MyClass的路径
Class<?> myClass = Class.forName("xxxx.MyClass");
// 创建类的实例
Object myInstance = myClass.newInstance();
// 获取类的属性 Field 对象
Field myField = myClass.getDeclaredField("myField");
// 设置属性的访问权限,因为 myField 可能是私有的
myField.setAccessible(true);
// 设置属性的值
myField.set(myInstance, "New Value");
// 打印结果
System.out.println("New value of myField: " + myField.get(myInstance));
} catch (Exception e) {
e.printStackTrace();
}
}
}
方法二设置属性demo
java
import java.lang.reflect.Field;
public class ReflectExample {
public static void main(String[] args) {
try {
// 使用MyClass.class获取类对象
Class<?> myClass = MyClass.class;
// 创建类的实例
Object myInstance = myClass.newInstance();
// 获取类的属性 Field 对象
Field myField = myClass.getDeclaredField("myField");
// 设置属性的访问权限,因为 myField 可能是私有的
myField.setAccessible(true);
// 设置属性的值
myField.set(myInstance, "New Value");
// 打印结果
System.out.println("New value of myField: " + myField.get(myInstance));
} catch (Exception e) {
e.printStackTrace();
}
}
}
方法三设置属性demo
java
import java.lang.reflect.Field;
public class ReflectExample {
public static void main(String[] args) {
try {
// 创建对象
MyClass myClazz = new MyClass();
// 使用对象.getClass(),获取类对象
Class<?> myClass = myClazz.getClass();
// 创建类的实例
Object myInstance = myClass.newInstance();
// 获取类的属性 Field 对象
Field myField = myClass.getDeclaredField("myField");
// 设置属性的访问权限,因为 myField 可能是私有的
myField.setAccessible(true);
// 设置属性的值
myField.set(myInstance, "New Value");
// 打印结果
System.out.println("New value of myField: " + myField.get(myInstance));
} catch (Exception e) {
e.printStackTrace();
}
}
}
方法四获取属性demo
java
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;
public class ReflectExample {
public static void main(String[] args) {
try {
// 创建对象
MyClass myClazz = new MyClass();
Field myField = ReflectionUtils.findField(MyClass.class, "myField", String.class);
ReflectionUtils.makeAccessible(myField);
ReflectionUtils.setField(myField, myClazz, "New Value");
// 打印结果
System.out.println("New value of myField: " + myClazz.getMyField());
} catch (Exception e) {
e.printStackTrace();
}
}
}
方法五获取属性demo
java
import org.springframework.test.util.ReflectionTestUtils;
public class ReflectExample {
public static void main(String[] args) {
try {
// 创建对象
MyClass myClazz = new MyClass();
ReflectionTestUtils.setField(myClazz, "myField", "New Value");
// 打印结果
System.out.println("New value of myField: " + myClazz.getMyField());
} catch (Exception e) {
e.printStackTrace();
}
}
}