根据Class.getField(强调我的)的Javadoc:
返回一个Field对象,该对象反映此Class对象表示的类或接口的指定公共成员字段。
此方法仅返回公共字段。 由于String str1 = (String) f1.get(cc.getClass());是私人的,因此找不到。
这是一个工作代码:
public class Main {
public static void main(String[] args) throws Exception {
Class> clazz = Class.forName("Child");
Object cc = clazz.newInstance();
Field f1 = cc.getClass().getField("a_field");
f1.set(cc, "reflecting on life");
String str1 = (String) f1.get(cc);
System.out.println("field: " + str1);
}
}
class Father implements Serializable {
public String a_field;
}
class Child extends Father {
//empty class
}
请注意,我还将行String str1 = (String) f1.get(cc.getClass());更改为2988717460985218018049,因为您需要提供字段的对象,而不是类。
如果要保持字段私有,则需要检索getter / setter方法并调用它们。 您提供的代码不起作用,因为要获取方法,还需要指定其参数,因此
cc.getClass().getMethod("setA_field");
一定是
cc.getClass().getMethod("setA_field", String.class);
这是一个工作代码:
public class Main {
public static void main(String[] args) throws Exception {
Class> clazz = Class.forName("Child");
Object cc = clazz.newInstance();
cc.getClass().getMethod("setA_field", String.class).invoke(cc, "aaaaaaaaaaaaaa");
String str1 = (String) cc.getClass().getMethod("getA_field").invoke(cc);
System.out.println("field: " + str1);
}
}
class Father implements Serializable {
private String a_field;
public String getA_field() {
return a_field;
}
public void setA_field(String a_field) {
this.a_field = a_field;
}
}
class Child extends Father {
//empty class
}