2011-09-21 12 views

risposta

46

"Using java.lang.reflect" risponderà a tutte le vostre domande. In primo luogo prendere l'oggetto Class utilizzando Class.forName(), e poi:

Se voglio creare un'istanza di una classe che ho recuperato con forName(), devo chiedere prima per un oggetto java.lang.reflect.Constructor che rappresenta il costruttore che voglio, e poi chiedere che Constructor per creare un nuovo oggetto. Il metodo getConstructor(Class[] parameterTypes) in Class recupererà un Constructor; Posso quindi utilizzare tale Constructor chiamando il suo metodo newInstance(Object[] parameters):

Class myClass = Class.forName("MyClass"); 

Class[] types = {Double.TYPE, this.getClass()}; 
Constructor constructor = myClass.getConstructor(types); 

Object[] parameters = {new Double(0), this}; 
Object instanceOfMyClass = constructor.newInstance(parameters); 

C'è un metodo newInstance() su Class che potrebbe sembrare a fare quello che vuoi. Non usarlo. Converte automaticamente le eccezioni controllate in eccezioni non controllate.

Si noti che questo metodo propaga qualsiasi eccezione generata dal costruttore null, inclusa un'eccezione controllata. L'uso di questo metodo supera in modo efficace il controllo delle eccezioni in fase di compilazione che altrimenti verrebbe eseguito dal compilatore. Il metodo Constructor.newInstance evita questo problema avvolgendo qualsiasi eccezione generata dal costruttore in un (controllato) InvocationTargetException.

+13

Da java 1.5, [constructor.newInstance()] (http://download.oracle.com/javase/1,5,0/docs/api/java/lang/reflect/Constructor.html#newInstance (java.lang .Oggetto ...)) è varargs, quindi 'costruttore.newInstance (new Double (0), this); 'farà (invece di usare l'ingombrante' Object [] 'way). Lo stesso vale per 'Class.getConstructor()' (non c'è bisogno di una brutta classe []) – Bohemian

+2

@Bohemian, bello. –

+0

Cosa succede se la classe è statica? Non avresti bisogno di un costruttore giusto? – anon58192932

7

È possibile utilizzare reflection. Ad esempio,

Object o = Class.forName(className).newInstance(); 

Ma className dovrebbe contenere il percorso completo della classe.

+5

Non utilizzare 'Class.newInstance'. Il [javadoc] (http://download.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance()) dice specificamente "L'uso di questo metodo aggira efficacemente il controllo delle eccezioni in fase di compilazione che altrimenti verrebbe eseguito dal compilatore. Il metodo 'Constructor.newInstance' evita questo problema avvolgendo qualsiasi eccezione generata dal costruttore in una (invocata) 'InvocationTargetException'." –

+0

Grazie! Non lo sapevo – Ilmirus

+0

@limirus, sì. È sepolto piuttosto in profondità nella javadoc. –

Problemi correlati