2011-07-13 21 views
4

I持って次のようにメソッドを持つクラス: - 私は次のようにこのメソッドを呼び出すためにJava Relectionsを使用していますIllegalArgumentExceptionがJavaのリフレクションを使用してメソッドを呼び出す呼び出すとき

public void setCurrencyCode(List<String> newCurrencycode){ 
    this.currencycode = newCurrencycode; 
} 

: -

try { 
    List<String> value = new ArrayList<String>(); 
    value.add("GB"); 

    Class<?> clazz = Class.forName("com.xxx.Currency"); 
    Object obj = clazz.newInstance(); 
    Class param[] = { List.class }; 
    Method method = obj.getClass().getDeclaredMethod("setCurrencyCode", param); 
    method.invoke(value); 
} catch(Exception e) { 
    System.out.println("Exception : " + e.getMessage()); 
} 

ただし、 "呼び出し"呼び出しで例外が発生します。 - java.lang.IllegalArgumentException:オブジェクトがクラス宣言のインスタンスではありません

アイデアはありますか?

おかげ

サラ

答えて

6

これはことを意味に渡すオブジェクトは、methodが定義されているクラスのインスタンスではありません。これは、invokeの最初の引数がになるオブジェクトであり、を呼び出しにし、後続の引数が呼び出されたメソッドのパラメータであるためです。 (値がcom.xxx.Currencyのインスタンスにする必要があるように、この場合、それは見えます - 。もちろん、それはない、それはListだから、)

あなたは非静的メソッドを呼び出す(トラブルに対するのとしているので

)新しいインスタンスを作成するのは、obj.setCurrencyCode(value)の反射同等のため、あなたのtryブロックの最後にあなたの代わりにあなたの現在のシングル1-argはコールの

method.invoke(obj, value) 

をコールする必要があると思います。

+0

素晴らしい!私は1つ以上の呼び出しメソッドがあることに気付かなかった!ご協力いただきありがとうございます。 –

7

あなたは正しくinvoke()を呼び出していません。invoke()は最初のパラメータはJava 1.5以降、次のパラメータ(としてメソッド呼び出しに続いパラメータとしてターゲットオブジェクトを期待し、それは可変引数ですパラメータ)

これを試してみてください:

try 
    { 
     List<String> value = new ArrayList<String>(); 
     value.add("GB"); 

     Class<?> clazz = Class.forName("com.xxx.Currency"); 
     Object obj = clazz.newInstance(); 
     // Since java 1.5, you don't need Class[] for params: it's a varargs now 
     Method method = clazz.getDeclaredMethod("setCurrencyCode", List.class); // you already have a reference to the class - no need for obj.getClass() 
     method.invoke(obj, value); // invoke expects the target object, then the parameters 
    } 
    catch(Exception e) 
    { 
     System.out.println("Exception : " + e.getMessage()); 
    } 
} 
関連する問題