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)

違いはgetDeclaredMethod()、可視性のあるメソッドのみを取得するの代わりに、すべての可視性(、、publicpackage protected/ defaultおよび)のメソッドを取得するを使用することです。privategetMethod()public

于 2013-01-22T09:51:04.537 に答える
3

呼び出したいメソッド(パブリック、プライベートなど)の可視性はどのくらいですか。直接呼び出すことができないメソッドを確認したい場合は、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");
    }

}
于 2013-01-22T09:57:55.500 に答える