1

これは可能ですか?文字列の値に応じて、あるクラスまたは別のクラスからオブジェクトをインスタンス化できますか?

私はこのようなコードを持っています:

public Map<Language, IConverter> converters;

// ...

public IConverter buildConverter(Language lang) {
    IConverter converter = new ???(buildMap(lang)); <---- Problem here

    converters.put(lang, converter);
}

public Map<Integer, String> buildMap(Language lang) {
    // ...
}

どこLanguageで は、言語を識別する文字列を含む Bean クラスであり、IConverterいくつかの (未定義の量の) コンクリートによって実装されるインターフェースConverterです。

ifサポートされているごとに句を追加する必要がありConverterますか? おそらくマップなどを使用して、どの文字列がどのクラスに属しているかを特定する方法はありますか?

Language クラスは、浅いものでスケーリングが見られないため、削除する可能性があります。

編集

Jesper の回答の使用を終了しましLanguageた。完全な言語名を含むようにクラスを調整し、パッケージ名、言語名、および「コンバーター」を連結する必要がありました。

少年、最初は反射が怖いです。非常に多くの例外があります。

4

3 に答える 3

1

文字列にクラスの名前がある場合は、リフレクションを使用してその新しいインスタンスを作成できます。例えば:

String className = "com.mycompany.SomeConverter";

// Creates an instance of the class by using the no-args constructor
IConverter converter = (IConverter) Class.forName(className).newInstance();

引数付きの特定のコンストラクターを使用する場合:

// For example, look for a constructor that takes one argument, a String
Constructor constr = Class.forName(className).getConstructor(String.class);

// Create a new instance, passing "Hello" as the argument
IConverter converter = (IConverter) constr.newInstance("Hello");
于 2013-10-31T13:47:53.417 に答える
0

これと非常によく似たものが必要かもしれません。

于 2013-10-31T13:47:54.953 に答える