8

我有 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

我在这里做错了什么?

4

2 回答 2

21

尝试这个:

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

不同之处在于 using getDeclaredMethod(),它获取所有可见性(publicprotected、包/默认和private)的方法,而不是getMethod(),它只获取具有public可见性的方法。

于 2013-01-22T09:51:04.537 回答
3

您要调用的方法(公共、私有等)的可见性是什么。如果要查看无法直接调用的方法,则应使用 getDeclaredMethod()。

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

我有以下代码,它可以工作:

爪哇

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");
    }

}
于 2013-01-22T09:57:55.500 回答