2009-09-17 20 views
26

Conozco el nombre de clase, por ejemplo "MiClase" y quiero recuperar el objeto Class, es decir. MyClass.class para futuras referencias. ¿Hay una manera de hacer eso?Cómo obtener un objeto de clase del nombre de clase en Java

He revisado la web, pero la mayoría de las cosas que encontré relacionadas con ella se referían al ClassLoader, que supongo que no son adecuadas para mi caso. No quiero inicializar una clase, sino solo obtener un objeto de clase para usos futuros.

EDIT: Con respecto a las primeras respuestas a esta:

Ya he comprobado el método forName() pero pensé que se supone que también inicializar la clase. Ahora puedo llamarlo con todos los argumentos y pasar false al segundo argumento, pero ¿el tercero tiene que ser null o qué?

Would

Class.forName("MyClass", false, null); 

retorno MyClass.class?

De hecho, lo que yo quiero hacer, es reemplazar un array de cadenas identificadores asociados con Class objetos, con una matriz de ID de la cual los objetos de clase se recuperan de forma automática, a deshacerse de algunos trabajos manuales :)

Gracias por las respuestas rápidas y disculpe por no mencionar esto antes.

Respuesta

45

que puede utilizar:

Class c = Class.forName("com.package.MyClass"); 

Y más tarde instancias de un objeto:

Object obj = c.newInstance(); 

EDIT: Esto es sólo el caso de uso más simple. Como se indicó en los comentarios, deberá considerar los argumentos del constructor y las excepciones lanzadas por el proceso de inicialización. El JavaDocs for newInstance tiene todos los detalles.

+0

Class.newInstance hace cosas malas con excepciones. –

+1

Sí. Tendrá que manejar cualquier excepción de inicialización. –

+2

Para que esto funcione, la clase debe tener un constructor no args accesible. – Jesper

7
Class.forName("MyClass") 

Leer the JavaDoc para más detalles

+0

Si no desea inicializar la clase, necesita la forma de tres argumentos. –

2

También vale la pena señalar que las sugerencias anteriores son correctas, pero solo funcionarán para los constructores predeterminados (sin parámetros). También podría hacer algo como:

public Object newInstance(String className, Object...args) throws Exception { 
     Class<?> clazz = Class.forName(className); 
     if(args == null || args.length == 0) { 
      return clazz.newInstance(); 
     } 

     List<Class<?>> argTypes = new ArrayList<Class<?>>(); 
     for(Object object : args) { 
      argTypes.add(object.getClass()); 
     } 
     Constructor<?> explicitConstructor = clazz.getConstructor(argTypes.toArray(new Class[argTypes.size()])); 
     return explicitConstructor.newInstance(args); 
    } 
+0

Esto no funcionará si uno de los argumentos es una subclase o implementación de un tipo que el constructor desea. – ColinD

Cuestiones relacionadas