通过反射调用子类的方法

2 java reflection

这是我的超类 Animal

class Animal
{
   //Empty
}
Run Code Online (Sandbox Code Playgroud)

我的子类 Tiger

class Tiger extends Animal
{
    public static void TigerPrint()
    {     -------
        System.out.println("Tiger");
    }
    public void Run()
    {
         System.out.println("Tiger Running");
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在做,

  Animal a=new Tiger();
Run Code Online (Sandbox Code Playgroud)

编译时 a将是一个Animal.At 运行时它将是Tiger.

所以我做了

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

我怎样才能通过反思来调用Run方法subclass.

是的,我能做到

((Tiger)a).Run();
Run Code Online (Sandbox Code Playgroud)

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

ass*_*ias 7

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

a.getClass().getMethod("Run").invoke(a);
Run Code Online (Sandbox Code Playgroud)

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