[Java] Creare un'istanza usando il nome della classe e il costruttore chiamante


Answers

È possibile utilizzare Class.forName() per ottenere un oggetto di classe della classe desiderata.

Quindi utilizzare getConstructor() per trovare l'oggetto Constructor desiderato.

Infine, chiama newInstance() su quell'oggetto per ottenere la nuova istanza.

Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> cons = c.getConstructor(String.class);
Object object = cons.newInstance("MyAttributeValue");
Question

C'è un modo per creare un'istanza di una particolare classe dato il nome della classe (dinamico) e passare i parametri al suo costruttore.

Qualcosa di simile a:

Object object = createInstance("mypackage.MyClass","MyAttributeValue");

Dove "MyAttributeValue" è un argomento per il costruttore di MyClass .




Un'altra risposta utile. Come posso usare getConstructor (params) .newInstance (args)?

return Class.forName(**complete classname**)
    .getConstructor(**here pass parameters passed in constructor**)
    .newInstance(**here pass arguments**);

Nel mio caso, il costruttore della mia classe prende Webdriver come parametro, quindi usato sotto il codice:

return Class.forName("com.page.BillablePage")
    .getConstructor(WebDriver.class)
    .newInstance(this.driver);






Puoi anche invocare metodi all'interno dell'oggetto creato.

È possibile creare un oggetto istantaneo richiamando il primo costruttore e quindi richiamare il primo metodo nell'oggetto creato.

    Class<?> c = Class.forName("mypackage.MyClass");
    Constructor<?> ctor = c.getConstructors()[0];
    Object object=ctor.newInstance(new Object[]{"ContstractorArgs"});
    c.getDeclaredMethods()[0].invoke(object,Object... MethodArgs);



Se la classe ha un solo costruttore vuoto (come Activity o Fragment etc, le classi android):

Class<?> myClass = Class.forName("com.example.MyClass");    
Constructor<?> constructor = myClass.getConstructors()[0];