2012-05-10 10 views
2

リフレクションの使用中に動的に作成されたクラスを型キャストする方法を見つけるのに問題があります。オブジェクトクラスはWRITEOUTというメソッドを持っているが、それは、動的に、ここで作成された9つの他の可能なクラスによって共有されているメソッドの名前である(すべてのWRITEOUT方法は、別々のことをやっ言うまでもなくしませんメソッドを実行するためにリフレクションによって作成されたオブジェクトを型キャストするにはどうすればよいですか?

String s; 
... 
Class unknownClass = Class.forName(s); 
Constructor defaultConstructor = unknownClass.getConstructor(null); 

Object retobj = defaultConstructor.newInstance(null); 
retobj.Writeout(); // This won't work since; 

)。助言がありますか ? Thxはあなたの時間の前に事前に。

+3

Writeout –

答えて

5

使用反射ルーク...

Method writeOutMethod = unknownClass.getMethod("Writeout", new Class[]{}); 
writeOutMethod.invoke(retobj, new Object[]{}); 

それとも、あなたのオブジェクトはよく知られてインターフェース(クリーンアプローチ)を実装することを保証すると言うことができます。

1

それをキャスト:

((YourObjectWithThatMethod) retobj).Writeout(); 

EDIT(ケビン・ウェルカーからのコメントを参照してください):

あなたの9つのすべてのクラスが同じインターフェイスを実装する場合は、そのインターフェイスにすべてのクラスをキャストすることができます

((YourInterface) retobj).Writeout(); 
+1

を実装しているすべてのクラスに対してインターフェイスを使用しないでください。また、そのメソッドを持つ9 + 1クラスのインターフェイスが必要で、インターフェイスで上記のテクニックを使用する必要があります。 –

1

9クラスはすべて、writeOut()メソッドを宣言する1つのインターフェイス(Outputと呼ぶ)を実装する必要があります。コードはこのようになります:あなただけの引数なしのコンストラクタを呼び出すためにunknownClass.newInstance()を使用することができ

Output retobj = (Output) defaultConstructor.newInstance(null); 
retobj.writeOut(); 

注意。

サイドノート:Java命名規則を尊重してください。メソッドは小文字で始まります。

1

すべての9つのクラスがスーパークラスまたはwriteOutを宣言または実装するインターフェイスを共有する場合は、retobjをそのインターフェイスにキャストしてから呼び出すことができます。

public interface Writable { 
    public void writeOut(); 
} 

次に、各クラスはクラス宣言にある必要があります。

class MyClass implements Writable { 
} 

次に、あなたは

((Writable) retobj).writeOut(); 
関連する問題