通过reflection调用子类的方法
这是我的超类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)
如何通过reflection调用subclass
的Run
方法。
是的,我能做到
((Tiger)a).Run();
但是我怎么能在反思中做到这一点!
您正在调用null实例上的实例方法 – 因此您接收NPE是有意义的。 试试这个(将实例传递给invoke
方法而不是null
):
a.getClass().getMethod("Run").invoke(a);
注意:第一次调用有效,因为您可以在空实例上调用静态方法而不会导致NPE。
你有两个选择要么使run()
方法静态并保持当前调用或更改当前调用以传递对象实例作为assylias指向。