2

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

我怎样才能调用通过反射的Run方法。subclass

是的,我可以

((Tiger)a).Run();

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

4

2 回答 2

7

您正在对空实例调用实例方法 - 因此您收到 NPE 是有道理的。试试这个(将实例传递给invoke方法而不是null):

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

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

于 2013-02-10T18:36:36.523 回答
0

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

于 2013-02-10T18:41:09.753 回答