"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
.
fonte
2011-09-21 07:07:53
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
@Bohemian, bello. –
Cosa succede se la classe è statica? Non avresti bisogno di un costruttore giusto? – anon58192932