Soweit ich weiß, was ich versuche (Titel) ist unmöglich. Hier sind jedoch 3 kleine Code-Beispiele - Der erste ist, was ich gerade habe, der zweite ist, was ich gerne hätte, der dritte ist ein Weg, um es zu erreichen, den ich nicht gebrauchen möchte zur Reflexion. Ich frage mich, ob es eine Möglichkeit gibt, meinen Code neu zu strukturieren, um dem zweiten Beispiel näher zu kommen. Es gibt einige Annahmen: Jede Klasse, die hier verwendet wird, hat nur einen Konstruktor und weiß genau, welche Objekte sie benötigt. Das Objekt [] ist, weil ich zur Laufzeit nicht alles weiß.Instanzieren von Klassenobjekt ohne Verwendung von Reflection
1.
Object o; Object[] params; String myString;
switch(myString){
case "ClassA": o = new ClassA(params);
case "ClassB": o = new ClassB(params);
//ETC
}
2.
Object o; Object[] params; String myString;
HashMap<String, Class<?>> map;
o = new map.get(myString)(params); //Obviously doesnt work
3.
Object o; Object[] params; String myString;
HashMap<String, Class<?>> map;
o = map.get(myString).getConstructors()[0].newInstance(params);
Bitte beachte, dass ich oben tatsächlich gelogen. Was ich gerade habe, ist nicht 1
, aber 3
. Ich kann nicht 1
haben, weil ich nicht alle Klassennamen fest codieren kann. Ich hätte gerne 2
obwohl. Irgendwelche Vorschläge?
Einige Erläuterungen:
Die HashMap in den Beispielen 2
und 3
enthalten Paare von String-Darstellungen des Klassennamen, und die tatsächlichen Klasse-Objekten.
Es ist auch zur Laufzeit gefüllt (offensichtlich), was bedeutet, dass ich alle möglichen Klassen kenne, die ich vor dem Ausführen des obigen Codes instanziieren möchte, aber ich kann keine von ihnen fest codieren: Sie werden von Datei geladen .
Warum willst du es? Was ist in 'map'? –
Instantiierung mit Reflexion, aber ohne Reflektion, ist kompliziert. – davidxxx
Wenn Sie nicht alle Klassennamen fest codieren können, können Sie auch nicht '2' haben oder wo sollen alle Zeichenfolgen herkommen? Oder ist es ein Missverständnis und Sie wissen zumindest irgendwann in Code über alle Klassen (ClassA, ClassB ...), die möglicherweise verwendet werden? –