2011-09-21 19 views

Respuesta

46

"Using java.lang.reflect" responderá a todas sus preguntas. En primer lugar buscar el objeto Class usando Class.forName() y, a continuación:

Si quiero crear una instancia de una clase que Recuperé con forName(), tengo que preguntar primero por un objeto java.lang.reflect.Constructor que representa el constructor que quiero, y luego pido que Constructor para hacer un nuevo objeto. El método getConstructor(Class[] parameterTypes) en Class recuperará un Constructor; entonces puedo usar esa Constructor llamando a su método 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); 

hay un método newInstance() en Class que podría parecer a hacer lo que quiera. No lo use. Convierte silenciosamente las excepciones comprobadas en excepciones sin marcar.

Tenga en cuenta que este método propaga cualquier excepción lanzada por el constructor nullary, incluida una excepción marcada. El uso de este método evita de manera efectiva la comprobación de excepciones en tiempo de compilación que, de otro modo, realizaría el compilador. El método Constructor.newInstance evita este problema al ajustar cualquier excepción lanzada por el constructor en un (marcado) InvocationTargetException.

+13

Desde java 1.5, [constructor.newInstance()] (http://download.oracle.com/javase/1,5,0/docs/api/java/lang/reflect/Constructor.html#newInstance (java.lang) .Object ...)) es varargs, entonces 'constructor.newInstance (nuevo Double (0), this); 'will do (en lugar de usar el engorroso' Object [] 'way). Lo mismo ocurre con 'Class.getConstructor()' (sin necesidad de feo Class []) – Bohemian

+2

@Bohemian, nice. –

+0

¿Qué pasa si la clase es estática? No necesitarías un constructor ¿no? – anon58192932

7

Puede utilizar reflection. Por ejemplo,

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

Pero className debe contener ruta completa a la clase.

+5

No utilice 'Class.newInstance'. [Javadoc] (http://download.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance()) dice específicamente "El uso de este método evita de manera efectiva la comprobación de excepciones en tiempo de compilación El método 'Constructor.newInstance' evita este problema al envolver cualquier excepción lanzada por el constructor en una (marcada)' InvocationTargetException'. " –

+0

¡Gracias! No sabía esto. – Ilmirus

+0

@limirus, sí. Está enterrado bastante profundo en el javadoc. –

Cuestiones relacionadas