这是我的超类Animal
class Animal
{
//Empty
}
我的子类Tiger
class Tiger extends Animal
{
public static void TigerPrint()
{ -------
System.out.println("Tiger");
}
public void Run()
{
System.out.println("Tiger Running");
}
}
现在我做,
Animal a=new Tiger();
编译时 a
为Animal
。运行时为Tiger
。
所以,我做了
a.getClass().getMethod("TigerPrint").invoke(null);//WORKS
a.getClass().getMethod("Run").invoke(null);//NOT WORKING (NullPointerException)
如何通过反思调用Run
subclass
方法。
是的我能做到
((Tiger)a).Run();
但我怎么能在反思中做到这一点!
答案 0 :(得分:7)
您正在调用null实例上的实例方法 - 因此您接收NPE是有意义的。请尝试此操作(将实例传递给invoke
方法而不是null
):
a.getClass().getMethod("Run").invoke(a);
注意:第一次调用有效,因为您可以在空实例上调用静态方法而不会导致NPE。
答案 1 :(得分:0)
你有两个选择:使run()
方法静态并保持当前调用或更改当前调用以传递对象实例作为assylias指向。