Creare un’istanza di un object di class con il costruttore che accetta un parametro stringa?

Vorrei istanziare un object dal suo object Class , usando il costruttore che accetta un singolo argomento String .

Ecco un codice che si avvicina a ciò che voglio:

 Object object = null; Class classDefinition = Class.forName("javax.swing.JLabel"); object = classDefinition.newInstance(); 

Tuttavia, crea un’istanza dell’object JLabel senza testo. Vorrei usare il costruttore JLabel che accetta una stringa come testo iniziale. C’è un modo per selezionare un costruttore specifico da un object Class ?

Class.newInstance richiama il costruttore no-arg (quello che non Class.newInstance parametri). Per richiamare un costruttore diverso, è necessario utilizzare il pacchetto reflection ( java.lang.reflect ).

Ottieni un’istanza di Constructor come questa:

 Class< ?> cl = Class.forName("javax.swing.JLabel"); Constructor< ?> cons = cl.getConstructor(String.class); 

La chiamata a getConstructor specifica che si desidera che il costruttore prenda un singolo parametro String . Ora per creare un’istanza:

 Object o = cons.newInstance("JLabel"); 

E hai finito.

PS Usa la riflessione solo come ultima risorsa!

Quanto segue funzionerà per te. Prova questo,

 Class[] type = { String.class }; Class classDefinition = Class.forName("javax.swing.JLabel"); Constructor cons = classDefinition .getConstructor(type); Object[] obj = { "JLabel"}; return cons.newInstance(obj); 

Class.forName("className").newInstance() richiama sempre nessun costruttore di default degli argomenti.

Per richiamare il costruttore parametrizzato anziché il costruttore zero argomento no-arg,

  1. È necessario ottenere Constructor con i tipi di parametri passando i tipi in Class[] per il metodo getDeclaredConstructor di Class
  2. È necessario creare un’istanza del costruttore passando valori in Object[] per
    metodo newInstance di Constructor

Codice di esempio:

 import java.lang.reflect.*; class NewInstanceWithReflection{ public NewInstanceWithReflection(){ System.out.println("Default constructor"); } public NewInstanceWithReflection( String a){ System.out.println("Constructor :String => "+a); } public static void main(String args[]) throws Exception { NewInstanceWithReflection object = (NewInstanceWithReflection)Class.forName("NewInstanceWithReflection").newInstance(); Constructor constructor = NewInstanceWithReflection.class.getDeclaredConstructor( new Class[] {String.class}); NewInstanceWithReflection object1 = (NewInstanceWithReflection)constructor.newInstance(new Object[]{"StackOverFlow"}); } } 

produzione:

 java NewInstanceWithReflection Default constructor Constructor :String => StackOverFlow 

Alcune volte non è necessario creare oggetti per la class da chiamare sono costruttori e metodi. Puoi chiamare metodi di class senza creare oggetti diretti. È molto facile chiamare un costruttore con parametro.

 import java.lang.reflect.*; import java.util.*; class RunDemo { public RunDemo(String s) { System.out.println("Hello, I'm a constructor. Welcome, "+s); } static void show() { System.out.println("Hello."); } } class Democlass { public static void main(String args[])throws Exception { Class.forName("RunDemo"); Constructor c = RunDemo.class.getConstructor(String.class); RunDemo d = (RunDemo)c.newInstance("User"); d.show(); } } 

l’output sarà:

Ciao, sono un costruttore. Benvenuto, Utente

Ciao.

Class.forName ( “RunDemo”); caricherà la class RunDemo.

Costruttore c = RunDemo.class.getConstructor (String.class); il metodo getConstructor () della class Constructor restituirà il costruttore che ha String come argomento e il suo riferimento è archiviato nell’object ‘c’ della class Constructor.

RunDemo d = (RunDemo) c.newInstance (“Utente”); il metodo newInstance () della class Constructor creerà un’istanza della class RundDemo e restituirà la versione generica dell’object e verrà convertita in tipo RunDemo utilizzando la trasmissione di tipo.

L’object ‘d’ di RunDemo contiene il riferimento restituito dal metodo newInstance ().