2011-08-18 10 views
2

たとえば、フィールド(myField)を持つクラス(A)があります。フィールドmyFieldのタイプは、インタフェース(I)です。すべてが公開されています。Java Reflection:フィールドがInterface Typeのフィールドの値を取得

* myField *のタイプのクラスのメソッドを呼び出す必要があります。私のコードは次のとおりです:

Field myField = getField(myClass, "fieldName"); 
Class fieldClass = myField.getType(); // returns I 

try { 
     Class[] params = {String.class}; 
     Method method = fieldClass.getMethod("methodName", params); 

     Object[] paramsObj = {new String("input")}; 
     boolean result = (Boolean) method.invoke(WHAT_MUST_I_PUT_HERE, paramsObj); 
} catch... 

あなたは問題が、私はのようなことを行うことができないで見ることができるように:誰かが私を助けることができる

WHAT_MUST_I_PUT_HERE = myField.getClass() // returns Field 

EDIT:私は

TargetClass o = (TargetClass) myField.get(myClass) 

を使用しようとしたが、invokeメソッドの最初の引数は、単にメソッドを呼び出すことでオブジェクトではIllegalArgumentException

答えて

0

ソリューションです:

Class myClass = service.getClass(); 
    Field myField = getField(myClass, "fieldName"); 

    TargetClass target = null; 
    try { 
     target = (TargetClass) myField.get(service); 
    } catch (IllegalAccessException e) { 
     e.printStatckTrace(); 
    } 

    Class fieldClass = myField.getType(); 
    try { 
     Class[] params = {String.class}; 
     Method myMethod = fieldClass.getMethod("methodName", params); 

     String paramItem = new String("value"); 
     Object[] paramsObj = {paramItem}; 
     boolean result = (Boolean) myMethod.invoke(target, paramsObj);   
    } catch ... 
7

をキャッチしています。だから、I.m(String)に対応する非静的メソッドがあるとしましょう。これを起動するには、Iのインスタンスが必要です(非静的メソッドなので)。

おそらくあなたは、したがって、あなたは、単に最初の引数としてmyFieldに渡し、反射によってmyField.m(input)と同等のものを呼びたい:

boolean result = (Boolean) method.invoke(myField, paramsObj); 
+0

は即答いただきありがとうございます。私はこれを試してみる。 – Dmitry

+0

その解決策は機能しません。 java.lang.IllegalArgumentExceptionが発生しました:オブジェクトがクラス宣言のインスタンスではありません – Dmitry

+0

myFieldにフィールド型があると考えています – Dmitry

関連する問題