通过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调用subclassRun方法。

是的,我能做到

 ((Tiger)a).Run(); 

但是我怎么能在反思中做到这一点!

您正在调用null实例上的实例方法 – 因此您接收NPE是有意义的。 试试这个(将实例传递给invoke方法而不是null ):

 a.getClass().getMethod("Run").invoke(a); 

注意:第一次调用有效,因为您可以在空实例上调用静态方法而不会导致NPE。

你有两个选择要么使run()方法静态并保持当前调用或更改当前调用以传递对象实例作为assylias指向。