这是我的超类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();


编译时aAnimal,运行时是Tiger

所以我做了

a.getClass().getMethod("TigerPrint").invoke(null);//WORKS
a.getClass().getMethod("Run").invoke(null);//NOT WORKING (NullPointerException)


如何通过反射调用Runsubclass方法。

是的,我可以

((Tiger)a).Run();


但是我该如何反思呢!

最佳答案

您正在对空实例调用实例方法-因此,收到NPE是有意义的。尝试以下方法(将实例传递给invoke方法而不是null):

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


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

10-04 16:18