2011-07-25 7 views
0

私はインターフェイスを持っており、そのインターフェイスの実装はいくつかあります。今度は、正しいImplementedメソッドを動的に呼び出す必要があります。実装メソッドを動的に呼び出す

実装クラス名はプロパティファイルから取得します。今私は反射を使用してメソッドを呼び出す必要があります。

どうすればよいでしょうか?

//This is my Interface. 

public interface ITestInterface{ 
    public CustomVO customMethod(CustomObj1 obj1,CustomObjec2 obj2); 
} 

//This class implements the above interface 

public class TestInterface implements ITestInterface{ 
    public CustomVO customMethod(CustomObj1 obj1,CustomObjec2 obj2){ 

    //some logic 
    } 
} 

ここで、Reflectionを使用してcustomMethod(obj1、obj2)を呼び出す必要があります。クラス名はTestInterfaceです。

これは私がやったことです。 Class.forName(className).newInstance();を使用してTestInterfaceのインスタンスを作成しました。

Class[] paramTypes = new Class[ 2 ]; 
paramTypes [ 0 ] = CustomObj1.class; 
paramTypes [ 1 ] = CustomObj2.class; 
Object obj=Class.forName(className).newInstance(); 

Class.forName(className).getMethod("customMethod", paramTypes).invoke(obj, obj1,obj2); 

これを行う正しい方法がわからないのですか?私を案内してくれませんか?

+1

まあ、それは動作しましたか? – biziclop

+0

はい、それはあなたがそれをやろうとしている方法です。 –

答えて

3

オブジェクトをリフレクションで作成することは、エラー処理を省略しても問題ありません(ここでは省略しています)。

オブジェクトを作成したら、単にITestInterfaceにダウンキャストして、そのメソッドを直接呼び出すのはなぜですか?

ITestInterface obj = (ITestInterface) Class.forName(className).newInstance(); 
obj.customMethod(param1, param2); 

(再び、ClassCastException取り扱いここでは省略されているが、それは、生産コードで対処する必要があります。)

+2

ダウンキャストの代わりに、私は 'Class <? ITestInterface> concreteClass = Class.forName(...)。asSubclass(ITestInterface.class) 'を継承します。そして、 'newInstance()'を呼び出すと、キャスティングを行う必要はありません。 –

+0

@マーク、チップのおかげで、それは本当に良い! –

関連する問題