我已经读了很多关于反射的文章,所有的例子都只是简单的访问string, double和int等对象。但是,我想访问对象,如Widget,文本,甚至自定义对象。我试过同样的方法作为字符串,但它失败了。
例如。
class testPrivate{
public boolean test()
{
return true;
}
}
class button {
public button(){
anc=new testPrivate();
}
private testPrivate anc;
}
public class Testing {
public static void main(String arg[]) throws Throwable{
button bt=new button();
Field field = bt.getClass().getDeclaredField("anc");
field.setAccessible(true);
System.out.println(field.test());
}
}
这里,语句System.out.println(field.test())中的field.test();失败。
Field
是指向类类型上的字段的类,而不是该类的任何特定实例。
为了调用一个方法,你首先需要一个该类的实例,然后你必须确保anc不为空。
的例子:
button bt=new button();
Field field = bt.getClass().getDeclaredField("anc");
field.setAccessible(true);
//This sets the field value for the instance "bt"
field.set(bt, new testPrivate());
然后,为了调用该方法,您需要获得该对象并调用该对象上的方法:
//Since field corresponds to "anc" it will get the value
//of that field on whatever object you pass (bt in this example).
testPrivate tp = (testPrivate) field.get(bt);
System.out.println(tp.test());
同样在文体上,类应该以大写字母开头,例如:button
→Button
和testPrivate
→TestPrivate