2010-08-26 14 views
48

Me gustaría crear una instancia de un objeto desde su objeto Class, usando el constructor que acepta un único argumento String.Crear una instancia de un objeto de clase con un constructor que acepte un parámetro de cadena?

Aquí hay un código que se acerca a lo que quiero:

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

Sin embargo, una instancia del objeto JLabel sin texto. Me gustaría utilizar el constructor JLabel que acepta una cadena como texto inicial. ¿Hay alguna manera de seleccionar un constructor específico de un objeto Class?

Respuesta

75

Class.newInstance invoca al constructor sin argumentos (el que no toma ningún parámetro). Para invocar un constructor diferente, debe usar el paquete de reflexión (java.lang.reflect).

obtener una instancia Constructor así:

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

La llamada a getConstructor especifica que desea que el constructor que toma un único parámetro String. Ahora para crear una instancia:

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

Y listo.

P.S. ¡Solo use la reflexión como último recurso!

8

Lo siguiente funcionará para usted. Prueba de esto,

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() siempre invoca ningún argumento por defecto constructor.

Para invocar el constructor parametrizado en lugar de cero argumento sin argumentos constructor,

  1. Usted tiene que conseguir Constructor con tipos de parámetros por tipos que pasan en Class[] para getDeclaredConstructor método de Class
  2. Tienes que crear el constructor instancia al pasar valores en Object[] para
    newInstance método de Constructor

código Ejemplo:

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

    } 
} 

salida:

java NewInstanceWithReflection 
Default constructor 
Constructor :String => StackOverFlow 
Cuestiones relacionadas