这是我的超类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)
如何通过反射调用subclass
的Run
方法。
是的,我可以做
((Tiger)a).Run();
但我怎么能在反思中做到这一点呢!
您正在一个null实例上调用一个实例方法,因此您收到一个NPE是有意义的。请尝试此操作(将实例传递给invoke
方法,而不是null
):
a.getClass().getMethod("Run").invoke(a);
注意:第一个调用成功了,因为您可以在不引起NPE的情况下对null实例调用静态方法。
您有两个选择,一个是使run()
方法保持静态并保持当前调用,另一个是更改当前调用以传递assylias所指向的对象实例。