2016-09-15 10 views
3

を反映して、私は私が私がしたい別の瓶のメソッドを持っているインタフェースはIllegalArgumentExceptionが

Service 

をimplents

ServiceImpl 

と呼ばれるクラスを持っていますそれがかかりますが、入力として

Service 

が入力されます。ここで方法は次のとおりです。

public void setService(Service service) { 
    context.setService(service); 
} 

私はエラーを取得するしかし

final ServiceImpl myService = new ServiceImpl(param1, param2); 


method = beanClass.getMethod("setService",Service.class); 

method.invoke("setService", myService); 

このメソッドを呼び出すためにリフレクションを使用しようとしました:

Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class 

それは、サービスクラスを期待していることを言っていますServiceImpl型のオブジェクトを渡しています。 ServiceImplはServiceを実装しているので、なぜそれが問題になるのでしょうか?これを回避するにはどうしたらいいですか?

答えて

2

反射が不平を言っているのはServiceパラメータではなく、最初のパラメータです。効果的に、あなたのコードはこれをしようとします:

"setService".setService(myService); 

これは明白な理由では機能しません。

は、あなたがこの問題を解決するための最初のパラメータとしてサービスを設定するオブジェクトを渡します。

method.invoke(instanceOfBeanClass, myService); 
+0

私はそのような効果的な呼び出し、素敵なものを示していると考えているはずです。 –

3

を文字列オブジェクト"setService"にコールしようとしています。 Method#invokeの最初のパラメータは、メソッドの名前ではなくメソッドを呼び出すオブジェクトです(既にそれが誰であるかを知っています)。 beanClassオブジェクトbeanClassを参照するクラスのインスタンスである

method.invoke(bean, myService); 

を...:

あなたが望んでいました。

関連する問題