Ich habe nach der Frage gesucht: Instanziieren Sie eine Klasse anhand ihres Zeichenfolgennamens, der beschreibt, wie eine Klasse instanziiert wird, wenn sie ihren Namen hat. Gibt es eine Möglichkeit, dies in Java zu tun? Ich habe den Paketnamen und den Klassennamen und muss in der Lage sein, ein Objekt mit diesem bestimmten Namen zu erstellen.
java
string
object
instantiation
ict1991
quelle
quelle
Antworten:
Zwei Wege:
Methode 1 - nur für Klassen mit einem Konstruktor ohne Argumente
Wenn Ihre Klasse über einen Konstruktor ohne Argumente verfügt, können Sie ein
Class
Objekt mithilfeClass.forName()
dernewInstance()
Methode abrufen und zum Erstellen einer Instanz verwenden ( beachten Sie jedoch, dass diese Methode häufig als böse angesehen wird, da sie die überprüften Ausnahmen von Java umgehen kann).Beispielsweise:
Methode 2
Ein alternativer sicherer Ansatz, der auch funktioniert, wenn die Klasse keine Konstruktoren ohne Argumente hat, besteht darin, Ihr Klassenobjekt abzufragen, um sein
Constructor
Objekt abzurufen, und einenewInstance()
Methode für dieses Objekt aufzurufen :Beide Methoden werden als Reflexion bezeichnet . In der Regel müssen Sie die verschiedenen Ausnahmen abfangen, die auftreten können, einschließlich:
quelle
newInstance()
, können wir es dann auf unser eigenes Objekt zurückwerfen?instance
zucom.foo.MyClass
? vorausgesetzt , com.foo.MyClass ist nur eine Zeichenfolgequelle
benutze Class.forName ("String name of class"). newInstance ();
Dies führt dazu, dass die Klasse A initialisiert wird.
quelle
Um es einfacher zu machen, den vollständig qualifizierten Namen einer Klasse zu erhalten, um eine Instanz mit zu erstellen
Class.forName(...)
, könnte man dieClass.getName()
Methode verwenden. Etwas wie:Dann können Sie das Objekt, das Sie erhalten, in die Klasse umwandeln, an die Sie übergeben
makeObject(...)
:quelle
clazz.newInstance()
statt dergetName
dannfromName
?Verwenden Sie Java Reflection
Erstellen neuer Objekte Es gibt kein Äquivalent zum Methodenaufruf für Konstruktoren, da das Aufrufen eines Konstruktors dem Erstellen eines neuen Objekts entspricht (genauer gesagt umfasst das Erstellen eines neuen Objekts sowohl die Speicherzuweisung als auch die Objektkonstruktion). Das nächste Äquivalent zum vorherigen Beispiel lautet also:
Hiermit wird ein Konstruktor gefunden, der die angegebenen Parametertypen verarbeitet und aufruft, um eine neue Instanz des Objekts zu erstellen. Der Wert dieses Ansatzes besteht darin, dass er rein dynamisch ist und die Konstruktorsuche und der Aufruf zur Ausführungszeit und nicht zur Kompilierungszeit erfolgen.
quelle
Class.forName ("ClassName") löst Ihren Zweck.
quelle
quelle
so etwas sollte funktionieren ...
quelle
Die
newInstance()
direkte Verwendung ist ab Java 8 veraltet. Sie müssen sieClass.getDeclaredConstructor(...).newInstance(...)
mit den entsprechenden Ausnahmen verwenden.quelle