2010-08-26 21 views
48

Vorrei istanziare un oggetto dal suo oggetto Class, usando il costruttore che accetta un singolo argomento String.Istanzia un oggetto di classe con il costruttore che accetta un parametro stringa?

Ecco po 'di codice che si avvicina quello che voglio:

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

Tuttavia, un'istanza dell'oggetto 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 oggetto Class?

risposta

75

Class.newInstance invoca il costruttore no-arg (quello che non prende alcun parametro). Per richiamare un costruttore diverso, è necessario utilizzare il pacchetto di riflessione (java.lang.reflect).

ottenere un'istanza Constructor come questo:

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

La chiamata a getConstructor specifica che si desidera che il costruttore che accetta un unico parametro String. Ora per creare un'istanza:

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

E il gioco è fatto.

P.S. Usa la riflessione solo come ultima risorsa!

8

Quanto segue funzionerà per voi. 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); 
2

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

Per richiamare costruttore parametrizzata invece di argomenti a zero costruttore no-arg,

  1. Dovete ottenere Constructor con tipi di parametri in base ai tipi di passaggio in Class[] per getDeclaredConstructor metodo Class
  2. È necessario creare costruttore istanza passando valori in Object[] per
    newInstance metodo di Constructor

codice 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"}); 

    } 
} 

uscita:

java NewInstanceWithReflection 
Default constructor 
Constructor :String => StackOverFlow 
Problemi correlati