3

usingClass以下はコード スニペットです。REFLECTIONを使用してメソッドを呼び出そうとしています。usingClass()Child 型のオブジェクトを渡すと、メソッドを直接 (リフレクションなしで)呼び出すことができますが、Reflection を使用して同じことを達成しようとすると、 がスローされNoSuchMethodFoundExceptionます。何かが欠けているかどうか、またはこれの背後に何らかの論理があるかどうかを理解したいですか? 助けてください

package Reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestMethodInvocation {

    /**
     * @param args
     */
    public static void main(String[] args) {
        TestMethodInvocation test = new TestMethodInvocation();
        Child child = new Child();
        Parent parent = (Parent)child;
        Class<? extends Parent> argClassType = parent.getClass();
        Class<? extends TestMethodInvocation>  thisClassType = test.getClass();

        test.usingClass(child);

        Method methodToCall;
        try {
            methodToCall = thisClassType.getDeclaredMethod("usingClass", argClassType);
            methodToCall.invoke(test, parent);
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private void usingClass(Parent p){
        System.out.println("UsingClass: " + p.getClass());
    }


}

出力は以下のとおりです。

UsingClass: class Reflection.Child
java.lang.NoSuchMethodException: Reflection.TestMethodInvocation.usingClass(Reflection.Child)
    at java.lang.Class.getDeclaredMethod(Unknown Source)
    at Reflection.TestMethodInvocation.main(TestMethodInvocation.java:20)
4

2 に答える 2

4

コードが機能しない理由は、getClass()動的にバインドされているためです。親にキャストしても、オブジェクトの実行時型には影響しないため、変数childparentには同じクラスオブジェクトが含まれます。または同様の方法でインスタンスの親クラスを明示的にクエリしない限りgetGenericSuperclass()、dystroyで説明されている静的な方法を使用する必要があります。

于 2012-06-11T06:52:32.910 に答える
1

使用する必要があります

methodToCall = thisClassType.getDeclaredMethod("usingClass", Parent.class);

の正確な正確なクラスparent(Child) が実行時に使用され、それを保持する変数の型は何も変更しないためです。

それを解決する別の(重すぎる)方法は次のとおりです。

Class<? extends Parent> argClassType2 = (new Parent()).getClass();
...
    methodToCall = thisClassType.getDeclaredMethod("usingClass", argClassType2);
于 2012-06-11T06:49:45.583 に答える