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()); } } }
上面的代码生成以下结果。