2011-09-14 15 views
3

実行時に生成されたclassNameStringに基づいて抽象クラスの特定のサブクラスのオブジェクトを作成する方法はありますか?例えば、抽象クラスAがあるとしよう。A、A2、..、NのN個のサブクラスが存在するとする。第二にJava:抽象クラスの特定のサブクラスをインスタンス化するメソッド

A getSubClassObject(String classNameString){ 
    A obj = null; 
    if(classNameString.equals("A1")){ 
     obj = new A1(); 
    }else if(classNameString.equals("A2")){ 
     obj = new A2();   
    } 
    ... 
    }else if(classNameString.equals("AN")){ 
     obj = new AN();   
    } 
    return obj; 
} 

A getSubClassObject(String classNameString){ 
    A obj = null; 
    try { 
     obj = this.subClassObjectsHashMap().get(classNameString).getNewInstance(); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    return obj; 
} 
private HashMap<String, A> subClassObjectsHashMap(){ 
    HashMap<String, A> subClassObjectsHashMap = new HashMap<String,A>(); 
    subClassObjectsHashMap.put("A1", new A1()); 
    subClassObjectsHashMap.put("A2", new A2()); 
    .... 
    subClassObjectsHashMap.put("AN", new AN()); 
    return subClassObjectsHashMap; 
} 
私は2つの 醜い実装まず 次いるclassNameString

に基づいて、サブクラスのオブジェクト
A getSubClassObject(String classNameString) 

を返す次のメソッドを記述する必要があります

この問題を解決する良い方法はありますか?

+0

クラス名を作成し、そのクラスを名前でロードします。 – bmargulies

+0

ありがとう!私の愚か者: -/ – porsh

答えて

2

はい、すべてのコンストラクタは、(あなたの例では、無PARAMATERS)同じパラメータを受信した場合、あなたが行うことができます

Class clazz = Class.forName("fully.qualified.class.nane"); 
A a = (A) clazz.newInstace(); 

両方のメソッドがさまざまな例外をスローする可能性があるため、いくつかのキャッチブロックを追加する必要があります。

+0

すべてのサブクラスに同じパラメータがあった場合はどうなりますか?例えば、ベースクラスのコンストラクタは です。 'A(String str){}' とサブクラスのコンストラクタは次のようになります。 'A1(String str、String str2){super(str);}' – porsh

+0

'Constructor c = Clazz.getConstructor(new Object [] {String.class});'は、文字列をパラメータとするコンストラクタを返します。そして、 'A a = c.newInstance(新しいオブジェクト[" your_string "])'。 Java Reflectionについて少しお読みください。これは、実行時にクラスを開き、プライベートメソッドを呼び出すような興味深いものを実行できるようにするJavaの機能です(p)。 – Augusto

+0

ポインタありがとう! Java Reflectionは本当にクールだ、ちょうど私が欲しかった:) – porsh

4

何適切なエラー処理を

return (A)Class.forName(runtimeClassName).newInstance(); 

のようなものをやってはどうですか?

+0

ありがとう!これは私のために働くだろう。私の悪い: -/ – porsh

0

のjava.lang.Class、メソッドにforName(文字列)とのnewInstance(でのJava APIでルック)

関連する問題