有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用反射调用超类方法

我有两门课,比如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) 个答案

  1. # 1 楼答案

    您想要调用的方法(public、private等)的可见性如何。 如果想查看无法直接调用的方法,应该使用getDeclaredMethod()

    还有,你的类的构造函数是什么样的?InstanceionException表示您在获取类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");
        }
    
    }
    
  2. # 2 楼答案

    试试这个:

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

    区别在于使用^{}而不是^{},后者只获取publicprotected、package/default和private可见性的方法