使用Reflection调用超类方法

时间:2013-01-22 09:44:02

标签: java

我有2个班,比如A& B:

Class A extends B {
    public void subClassMthd(){
        System.out.println("Hello");
    }
}

Class B {
    public void printHelloWorld {
        System.out.println("Hello");
    }
}

现在,我使用反射来调用A类的方法。我还想调用B类中的printHelloWorld方法。

我尝试使用

Class clazz = Class.forName("com.test.ClassA");
Object classAInstance= clazz.newInstance();
Method superClassmthd = classAInstance.getClass()
    .getSuperclass().getMethod("printHelloWorld", null);
superClassmthd.invoke(classAInstance);

也试过

Class clazz = Class.forName("com.test.ClassA");
Object classAInstance= clazz.newInstance();
Class superClazz = Class.forName(classAInstance.getClass().getSuperclass().getName());
Object superclassInstance = superClazz.newInstance();
Method superClassmthd = superclassInstance.getMethod("printHelloWorld", null);
superClassmthd.invoke(superclassInstance );

但它们都不起作用;他们抛出InstantiationException

我在这里做错了什么?

2 个答案:

答案 0 :(得分:17)

试试这个:

Method mthd = classAInstance.getClass().getSuperclass().getDeclaredMethod("XYZ");
mthd.invoke(classAInstance)

不同之处在于使用getDeclaredMethod()来获取所有可见性的方法(publicprotected,包/默认和privategetMethod()的{{}仅获得public可见性的方法。

答案 1 :(得分:2)

您要呼叫的方法的可见性是什么(公共,私人等)。 如果你想看到你不能直接调用的方法,你应该使用getDeclaredMethod()。

另外,你的类的构造函数是什么样的? InstantiationException表示您在获取A类(或B)的实例时遇到问题。

我有以下代码并且有效:

A.java

import java.lang.reflect.Method;

public class A extends B {

    public static void main(String[] args) throws Exception {
        A classAInstance = new A();
        Method mthd = classAInstance.getClass().getSuperclass().getMethod("XYZ", null);
        mthd.invoke(classAInstance);
    }

}

B.java

public class B {

    public void XYZ() {
        System.out.println("done");
    }

}