Gibt es eine Möglichkeit, eine Instanz einer bestimmten Klasse mit dem Klassennamen (dynamisch) zu erstellen und Parameter an ihren Konstruktor zu übergeben?
Etwas wie:
Object object = createInstance("mypackage.MyClass","MyAttributeValue");
Wo "MyAttributeValue"
ist ein Argument an den Konstruktor von MyClass
.
java
reflection
instantiation
TheLameProgrammer
quelle
quelle
newInstance()
ist eine varargs-Methode (genau wieGetConstructor()
), es ist keine expliziteObject
Array-Erstellung erforderlich.Object[]
Argument haben, ziehe ich es vor, das Array in diesem Fall explizit zu erstellen.Sie können verwenden
Class.forName()
, um einClass
Objekt der gewünschten Klasse abzurufen.Verwenden Sie dann
getConstructor()
, um das gewünschte zu findenConstructor
Objekt .Rufen Sie
newInstance()
abschließend dieses Objekt auf, um Ihre neue Instanz abzurufen.quelle
Sie können Reflexionen verwenden
quelle
Class.forName(className).getConstructor().newInstance();
;)Wenn die Klasse nur einen leeren Konstruktor hat (wie Aktivität oder Fragment usw., Android-Klassen):
quelle
Constructor<?> ctor = clazz.getConstructor(String.class)
schien nicht für mich zu arbeiten.Bei Verwendung (dh) muss
getConstructor(String.lang)
der Konstruktor als öffentlich deklariert werden. AnsonstenNoSuchMethodException
wird a geworfen.Wenn Sie auf einen nicht öffentlichen Konstruktor zugreifen möchten, müssen Sie stattdessen (dh) verwenden
getDeclaredConstructor(String.lang)
.quelle
Sie möchten java.lang.reflect.Constructor.newInstance (Object ...) verwenden.
quelle
Sehr einfache Möglichkeit, ein Objekt in Java zu erstellen, indem
Class<?>
Konstruktorargumente übergeben werden:Fall 1: - Hier ist ein kleiner Code in dieser
Main
Klasse:Und hier ist die
Base
Klassenstruktur:Fall 2: - Sie können ähnlich für den Konstruktor mit mehreren Argumenten codieren und den Konstruktor kopieren. Wenn Sie beispielsweise 3 Argumente als Parameter an den
Base
Konstruktor übergeben, muss der Konstruktor in der Klasse erstellt und der Code wie folgt geändert werden:Und hier sollte die Basisklasse irgendwie aussehen:
Hinweis: - Vergessen Sie nicht, die verschiedenen Ausnahmen zu behandeln, die im Code behandelt werden müssen.
quelle
Wenn jemand nach einer Möglichkeit sucht, eine Instanz einer Klasse zu erstellen, obwohl die Klasse dem Singleton-Muster folgt, finden Sie hier eine Möglichkeit, dies zu tun.
Dies funktioniert nur für Klassen, die Singleton-Muster mit einem privaten Konstruktor implementieren.
quelle
Sie können auch Methoden innerhalb des erstellten Objekts aufrufen.
Sie können ein Objekt sofort erstellen, indem Sie den ersten Konstruktor aufrufen und dann die erste Methode im erstellten Objekt aufrufen.
quelle
String
einen Parameter verwendet? Wird ein wenig chaotisch, wenn Sie die Konstruktorreihenfolge änderngetConstructor(ClassName.class)
immer noch besser, denke ich. Selbst wenn sich die Reihenfolge der Konstruktoren in der Klasse ändert, muss die Position nicht manuell gefunden werdenEine weitere hilfreiche Antwort. Wie verwende ich getConstructor (params) .newInstance (args)?
In meinem Fall verwendet der Konstruktor meiner Klasse den Webdriver als Parameter, der unter dem folgenden Code verwendet wird:
quelle