Posso istanziare una class usando l’object class? E i costruttori?

Sto memorizzando un elenco di classi tramite ( Classname.class ) e vorrei istanziarne uno? È ansible?

newInstance sembra il metodo che sto cercando ma non supporta un costruttore?

Non puoi build nuove classi in questo modo.

Se hai il nome di una class, puoi usare Class.forName (className) per caricare / fare riferimento a una class.

Se si dispone del codice byte per una class che si desidera creare, è ansible che un programma di caricamento class carichi il codice byte e fornisca la class. È probabile che sia più avanzato di quanto previsto.

È ansible utilizzare Class.getConstructors (o Class.getConstructor) per ottenere un elenco di costruttori disponibili e richiamarne uno con Constructor.newInstance , che accetta i parametri.

Solo per aggiungere un punto che vedo mancante:

È ansible richiamare newInstance direttamente sull’object Class se ha un costruttore null pubblico. (Il costruttore Null è il costruttore senza argomenti.)

Altrimenti, puoi trovare costruttori tramite Class.getConstructors() come altri hanno già detto.

Il tutorial Java sulla riflessione copre bene questo aspetto. Ma sì, praticamente Class.getConstructors, quindi Constructor.newInstance è dove si trova.

Java è progettato in modo da non poterlo “ingannare” finchè usi java.lang / java. classi o altre librerie standard. Una delle cose più importanti di OOP è che gli oggetti dovrebbero essere in uno stato definito, quindi si può essere sicuri che il costruttore sia sempre eseguito. Anche se stai utilizzando alcune librerie di riflessi dall’aspetto strano per portare a termine il tuo lavoro.

Quindi, usando Class.forome (“me.Test”). NewInstance (); (o simile) invocheranno il costruttore di Test () per te.

Se vuoi invocare un altro costruttore, il codice è qualcosa del tipo:

 Test test = (Test)Class.forName("Test").getConstructor(String.class).newInstance("Hello World"); 

Qui il getConstructor chiede come si presenta il costruttore (vuole una stringa) e poi lo si chiama con una stringa.

Se si ha una lista di oggetti di Class ottenuti attraverso i letterali di class, si potrebbe anche fare un riferimento statico ai costruttori piuttosto che scivolare nel riflesso della malvagità.