2017-02-24 14 views
0

私が知る限り、私がやっていること(Title)は不可能です。 しかし、ここにはコードの3つの小さなサンプルがあります - 最初のものは私が現在持っているもの、2番目は私が望むもの、3番目は達成するための方法です。反射へ。 2番目の例に近づくようにコードを再構築する方法があるのだろうかと思います。 いくつかの前提があります。ここで使用される各クラスはコンストラクタが1つしかなく、必要なオブジェクトを正確に認識しています。 Object []は、私が実行時にすべてを知っていないためです。リフレクションを使用しないクラスオブジェクトのインスタンス化

Object o; Object[] params; String myString; 
switch(myString){ 
case "ClassA": o = new ClassA(params); 
case "ClassB": o = new ClassB(params); 
//ETC 
} 
Object o; Object[] params; String myString; 
HashMap<String, Class<?>> map; 
o = new map.get(myString)(params); //Obviously doesnt work 
Object o; Object[] params; String myString; 
HashMap<String, Class<?>> map; 
o = map.get(myString).getConstructors()[0].newInstance(params); 

Iは実際に上記の嘘注意。私が今持っているのは1ではなく、3です。私はすべてのクラス名をハードコードできないので、1を持つことはできません。私は2を持っていたいと思います。助言がありますか?

いくつかの明確化:

例でのHashMap 23は、クラス名の文字列表現、および実際のクラスのオブジェクトのペアを含みます。

また、実行時に(明らかに)埋められます。つまり、上のコードを実行する前にインスタンス化する可能性のあるすべてのクラスを知っていることを意味しますが、それらをハードコードすることはできません。 。

+0

なぜあなたはそれを望みますか? 'map'には何がありますか? –

+3

反射ではなく反射を使用せずにインスタンシエートすることは複雑です。 – davidxxx

+0

すべてのクラス名をハードコーディングできない場合は、 '2 'を指定することはできません。また、すべての文字列をどこから取得する必要がありますか?または、それは誤解であり、おそらく使用されるすべてのクラス(ClassA、ClassB ...)について、コードのある時点で知っていますか? –

答えて

2

ご連絡申し訳ございません:
Javaではできません。

リフレクションを使用してクラスをインスタンス化することはできますが、リフレクションを使用しないで、二項性の原則に従わない独自の言語を作成してください。がんばろう。

+0

まあ、文句は私の問題を説明することだった。実際の問題は、エンティティのモジュール化された読み込みを許可しながらリフレクションを避けるために、コードをどのように再構築できなければならないかです。 – user2065501

+0

私はそれが不可能だと確信しています。あなたはそれを行い、中央のMavenリポジトリで(それを隠すために)ホストする独自のツールを書くことができます。 –

+0

私は実際には、上記のすべてのコメントを考慮して、コードを再構築する方法を見つけた可能性があると考えています。HashMapでは、エンティティの文字列名と "EntityFactory"を格納します。その特定のエンティティの新しいインスタンスを返します。したがって、新しいエンティティを追加することは、私の "登録"メソッドを呼び出すことと同じくらい簡単です: 'bla.registerEntity( "EntityType"、new EntityFactory(){@ publicエンティティをオーバーライドするcreate(Object [] params){new EntityType((int)paramsしたがって、名前を持つインスタンスが必要な場合は、単純に 'map.get(name).create(params)' :)! – user2065501

関連する問題