Was ist der richtige Weg, um reflektion verwenden, um Objekte zu instanziieren von unbekannten Klassen zur Laufzeit?
Arbeite ich an einer Konfiguration Loader-Klasse, so dass ich ändern kann, die Parameter an mein Programm über eine externe text-Datei (config.txt), anstatt Sie zu kompilieren, meinen code bei jeder änderung die ich mache.
Es wurde vorgeschlagen, dass ich die Java Reflection um dies zu tun, aber ich bin ein wenig verwirrt, wie könnte ich tatsächlich umzusetzen.
Konnte ich erfolgreich extrahieren den Namen der Klasse und die Argumente für den Konstruktor aus meiner text-Datei, aber wie mache ich daraus ein Objekt instanziiert?
hier ist, was ich von meiner Methode so weit:
public void loadObject(String classString, HashMap hm)
{
String className = props.getProperty(classString);
Class c = Class.forName(className);
}
classString ist ein string mit dem Namen der Klasse, und hm ist eine hashmap, wo die Klasse' Konstruktor-Parameter anzeigen, um Ihre beabsichtigte Werte.
I. e., für class Foo (int xPos, float yPos)
, "xPos" würde die Karte in einen string der beabsichtigten int " und "yPos" Karten " zu einem string der beabsichtigten schweben. Ich wollen zurückkehren zu können, new Foo(hm.get"xPos".toInt, hm.get"yPost".toFloat)
, aber ich bin mir nicht sicher, wie Sie dynamisch verwenden Sie einen Konstruktor wie (die Frage ist, gibt es mehrere mögliche Klassen-vielleicht ist es ein bar
statt einer foo
zum Beispiel).
Ich weiß, dass Ihr möglich, eine if/else-basierend auf der classString, und rufen Sie einfach die richtige Konstruktor nach der Identifizierung es so, aber ich bin auf der Suche, um eine erweiterbare code muss nicht umgeschrieben werden jedes mal, wenn ich eine neue Klasse hinzuzufügen, um das Programm.
Alle möglichen Objekte Erben von einem einzelnen übergeordneten Objekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie
Class.getConstructor(Class<?>... parameterTypes)
um eine Referenz an den Konstruktor gefolgt vonConstructor.newInstance(Object... initargs)
.Allerdings würde ich vorschlagen, einen Blick auf ein dependency-injection-Frameworks wie Spring oder Guice, wie es klingt, was Sie erstellen ist eine einfache version von dem, was Sie tun.
Auf Anfrage für den ausbau dieser Antwort:
Natürlich statt
param1
undparam2
erstellen Sie ein array von Argumenten, basierend auf dem, was in der input-Datei (das gleiche gilt für die Argumente, diegetConstructor()
), etc.Hier ist ein Beispiel, es zu tun, aus dem Programm-Argumente:
Natürlich, die
argList
können immer nur Strings in diesem Falle, weil Sie gezogen von einerString[]
, aber man könnte hinzufügen, Argumente beliebigen Typs. Beachten Sie, dass die Konstruktor-Argumente sind positions -, nicht benannt, so sind die Namen in der Karte nicht tun Sie viel gutes. Sie müssen in der richtigen Reihenfolge.Versuchen Sie Sie und Sie "java".util.Datum" als argument.