2

リフレクションを使用しているときに動的に作成されたクラスを型キャストする方法を見つけるのに問題があります。

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

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

オブジェクトクラスにはWriteoutというメソッドはありませんが、これは、ここで動的に作成される他の9つの可能なクラスによって共有されるメソッドの名前です(言うまでもなく、すべてのWriteoutメソッドは別々のことを行います)。助言がありますか ?あなたの時間のために事前にThx。

4

4 に答える 4

5

リフレクションルークを使用...

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

または、オブジェクトがよく知られているインターフェイスを実装していることを確認します(クリーンなアプローチ)。

于 2012-05-10T17:22:46.433 に答える
1

キャスト:

 ((YourObjectWithThatMethod) retobj).Writeout(); 

編集(Kevin Welkerからのコメントを参照):

9 つのクラスすべてが同じインターフェイスを実装している場合、すべてのクラスをそのインターフェイスにキャストできます。

 ((YourInterface) retobj).Writeout(); 
于 2012-05-10T17:20:40.060 に答える
1

9 つのクラスはすべて、メソッドOutputを宣言する単一のインターフェイス (それを と呼びましょう) を実装する必要があります。writeOut()したがって、コードは次のようになります。

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

unknownClass.newInstance()を使用して、引数なしのコンストラクターを呼び出すことができることに注意してください。

補足: Java の命名規則を尊重してください。メソッドは小文字で始まります。

于 2012-05-10T17:21:37.573 に答える
1

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

public interface Writable {
    public void writeOut();
}

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

class MyClass implements Writable {
}

それからあなたは言うことができます

((Writable) retobj).writeOut();
于 2012-05-10T17:21:51.563 に答える