2012-02-09 7 views
0

私は抽象クラス 'A'を持ち、クラス 'B'と 'C'はAを継承しています。 実行時にいくつかの変数に基づいてこれらのインスタンスを作成します。以下のような何か:Java Reflection

public abstract class A { 
    public abstract int count(); 
} 

public class B extends A { 
    public int count() { 
     //print 10; 
    } 
} 

public class C extends A { 
    public int count() { 
     //print 20; 
    } 
} 

私はメソッド数呼び出すために以下のコードを使用します。

  1. :私はJavaの反射に新しいですので、ここで、

    String token; 
    int i = 10; 
    if (i == 10) //edit 
        token = "B"; 
    else 
        token = "C"; 
    
    A a; 
    try { 
        a = (A) (Class.forName("org.source."+token)).newInstance(); 
    } catch (Exception e) { 
        //print e 
    } 
    
    a.count(); 
    

    は私の2つの質問です

    私は上記の権利を行っていますか(編集:デフォルトのコンストラクタの場合)? (私ははいと推測しています)

  2. デフォルトのコンストラクタ(パラメータなし)が呼び出された場合、上記は機能します。どのように私は引数を取るコンストラクタを持っている状況を処理するだろう。私はConstructor.newInstance()をどのように使用することができるかはわかりませんが、上記の状況で使用できます。

すべてのヘルプ感謝、何をやっている

+2

if(1)は、Javaでは動作しません。また、クラスの "newInstance"は0-argコンストラクタでのみ動作します。したがって、このアプローチでは引数を必要とするコンストラクタを呼び出すことはできません。 – eternaln00b

+0

達成しようとしていることを説明できますか?反射は、しばしば仕事のための適切なツールではありません。 – Vadim

答えて

1

はいそうです。

デフォルト(引数なし)以外のコンストラクタを使用する場合は、を参照してください。

たとえば、intString引数を使用してコンストラクタを呼び出したいとします。

Class<?> clazz = Class.forName("org.source."+ token); 
Constructor<?> constructor = clazz.getConstructor(int.class, String.class); 
Object object = constructor.newInstance(1, "hello"); 
1

は本当に、あなたが「のnewInstance」方式で行うことができます唯一のものである、あなたは引数なしのコンストラクタを呼び出したい右の場合にのみですクラス。参照:

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#newInstance()

をコンストラクタのクラスを使用して、n型引数でコンストラクタを呼び出すために:

http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Constructor.html#newInstance(java.lang.Object ...)

にの用途上の例に対する反射チュートリアルを参照してください上記:詳細情報については

http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html

関連する問題