第二百一十四节 Java反射 - Java反射字段访问
Java反射 - Java反射字段访问
我们可以使用反射在两个步骤中获取或设置字段。
- 获取字段的引用。
- 要读取字段的值,请在字段上调用getXxx()方法,其中Xxx是字段的数据类型。
- 要设置字段的值,请调用相应的setXxx()方法。
以相同的方式访问静态和实例字段。
例子
import java.lang.reflect.Field;class MyClass {public String name = "Unknown";public MyClass() {}public String toString() {return "name=" + this.name;} } public class Main {public static void main(String[] args) {Class<MyClass> ppClass = MyClass.class;try {MyClass p = ppClass.newInstance();Field name = ppClass.getField("name");String nameValue = (String) name.get(p);System.out.println("Current name is " + nameValue);name.set(p, "abc");nameValue = (String) name.get(p);System.out.println("New name is " + nameValue);} catch (InstantiationException | IllegalAccessException| NoSuchFieldException | SecurityException | IllegalArgumentException e) {System.out.println(e.getMessage());}} }
上面的代码生成以下结果。
绕过辅助功能检查
使用反射访问类的非可访问字段,方法和构造函数从 AccessibleObject
类调用 setAccessible(boolean flag)
方法。
我们需要使用true参数调用此方法,以使该字段,方法和构造函数可访问。
import java.lang.reflect.Field;class MyClass {private String name = "Unknown";public MyClass() {}public String toString() {return "name=" + this.name;} }public class Main {public static void main(String[] args) {Class<MyClass> my = MyClass.class;try {MyClass p = my.newInstance();Field nameField = my.getDeclaredField("name");nameField.setAccessible(true);String nameValue = (String) nameField.get(p);System.out.println("Current name is " + nameValue);nameField.set(p, "abc");nameValue = (String) nameField.get(p);System.out.println("New name is " + nameValue);} catch (InstantiationException | IllegalAccessException| NoSuchFieldException | SecurityException | IllegalArgumentException e) {System.out.println(e.getMessage());}} }
上面的代码生成以下结果。