通过反射访问一个类中定义的成员字段也可以修改一个类的对象中的成员字段值,通过`getField()`方法来获取一个类定义的指定字段
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws ReflectiveOperationException {
Class<Person> clazz = Person.class;
Person person = clazz.getConstructor(String.class).newInstance("zp");
Field field = clazz.getField("name");//获取成员字段name
field.set(person, "zzp"); //将成员字段name修改为zzp
Method method = clazz.getMethod("getName");
System.out.println(method.invoke(person));
}
}
class Person{
public String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
当访问private字段时,同样可以通过setAccessible()方法进行越权访问
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws ReflectiveOperationException {
Class<Person> clazz = Person.class;
Person person = clazz.getConstructor(String.class).newInstance("zp");
Field field = clazz.getDeclaredField("name");//获取成员字段name
field.setAccessible(true);
field.set(person, "zzp"); //将成员字段name修改为zzp
Method method = clazz.getMethod("getName");
System.out.println(method.invoke(person));
}
}
class Person{
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}