我有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。
我在这里做错了什么?
答案 0 :(得分:17)
试试这个:
Method mthd = classAInstance.getClass().getSuperclass().getDeclaredMethod("XYZ");
mthd.invoke(classAInstance)
不同之处在于使用getDeclaredMethod()
来获取所有可见性的方法(public
,protected
,包/默认和private
) getMethod()
的{{}仅获得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");
}
}