1

文字列に基づいてインスタンス化されたクラスを返す必要がある場合(たとえば、JSONからロジックを作成する場合)、それをどのように記述する必要がありますか?

私の最初の考えはスイッチでしたが、AndroidフレームワークのバージョンのJavaでは、switchステートメントは文字列を許可していないようです。

次の考えはHashMapでした:

private HashMap<String, Class> classMap = new HashMap<String, Class>();
classMap.put("someClass", SomeClass.class)?
// ... etc
String someString = jsonObject.getString("someProperty");
Class classRef = classMap.get(someString);
SomeSuperClass classInstance = new classRef();

これは機能しません。if/else可能性の長いリストを下に置きたくありません。

4

3 に答える 3

6

次に、Thenを使用Class<?> clazz = Class.forName("com.yourpackage.YourClass")してインスタンス化します。clazz.newInstance();

于 2012-05-07T18:43:17.323 に答える
1

コンストラクターパラメーターを使用してクラスをロードすることもできます。

例えば

public static void load(String p)
    throws ClassNotFoundException, InstantiationException,
    IllegalAccessException{
        Class cl = classLoader.loadClass(p);
        Constructor c = cl.getConstructor(String.class);
        Plugin plug = (Plugin) c.newInstance("myArgument");
    }
于 2012-05-07T18:53:54.583 に答える
0

マップを使用するあなたのアプローチは私がすることです(そしてあなたはそれをファクトリパターンの実装で見るでしょう)。クラスを正しくインスタンス化していないだけです。

Class classRef = classMap.get(someString);
SomeSuperClass classInstance = classRef.newInstance();
于 2012-05-07T18:44:44.297 に答える