我們可以使用反射在兩個(gè)步驟中獲取或設(shè)置字段。
以相同的方式訪問靜態(tài)和實(shí)例字段。
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()); } } }
上面的代碼生成以下結(jié)果。
使用反射訪問類的非可訪問字段,方法和構(gòu)造函數(shù)從 AccessibleObject
類調(diào)用 setAccessible(boolean flag)
方法。
我們需要使用true參數(shù)調(diào)用此方法,以使該字段,方法和構(gòu)造函數(shù)可訪問。
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()); } } }
上面的代碼生成以下結(jié)果。
更多建議: