2017-02-24 6 views
0

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 .

+0

Warum willst du es? Was ist in 'map'? –

+3

Instantiierung mit Reflexion, aber ohne Reflektion, ist kompliziert. – davidxxx

+0

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? –

Antwort

2

Es tut mir leid zu informieren:
ist es in Java nicht möglich.

Schreiben Sie Ihre eigene Sprache, die nicht dem Prinzip der Bivalenz folgt, wo Sie eine Klasse mit Reflektion instanziieren können, aber ohne Verwendung von Reflektion. Viel Glück.

+0

Nun, die Formulierung war nur um mein Problem zu veranschaulichen. Die eigentliche Frage ist, wie ich meinen Code restrukturieren könnte und sollte, um Reflexionen zu vermeiden, während man Module modular laden kann. – user2065501

+0

Ich wette, das ist unmöglich. Du könntest dein eigenes Tool schreiben, das es tut, und es im zentralen Maven-Repository hosten (um es zu verstecken). –

+0

Ich glaube tatsächlich, dass ich einen möglichen Weg gefunden habe, meinen Code neu zu strukturieren, wobei ich alle obigen Kommentare berücksichtigen muss: In einer HashMap speichere ich den String-Namen einer Entität und eine "EntityFactory", was eine Klasse ist eine neue Instanz dieser spezifischen Entität zurückgeben. Das Hinzufügen neuer Entitäten ist also so einfach wie das Aufrufen meiner "registrierenden" Methode: 'bla.registerEntity (" EntityType ", neue EntityFactory() {@ öffentliche Entität überschreiben create (Object [] params) {new EntityType ((int) params [0]);}} 'Zum Beispiel, wenn ich eine Instanz brauche und einen Namen habe, kann ich einfach:' map.get (name) .create (params) ':)! – user2065501

Verwandte Themen