2010-03-09 12 views
57

Tengo un String que tiene el nombre de una clase, por ejemplo "Ex" (sin extensión .class). Quiero asignarlo a una variable Class, así:Obteniendo el tipo de Clase de Cadena

Class cls = (string).class 

¿Cómo puedo hacer eso?

+0

¿Qué pasa si la clase está en proyecto diferente? – Steven

+0

Para su comentario: ¡¿Qué? ??? Si su clase estaba en un proyecto diferente, ¿no dependería de su IDE? En lo que concierne a su aplicación, sería como si estuviera en el mismo proyecto de todos modos porque sus bibliotecas están referenciadas externamente. Como, sabes que las clases de la API de Java no están en tu proyecto, ¿verdad? Pero, el compilador de su IDE sabe dónde encontrarlos, si su IDE está configurado correctamente. Lo mismo aplica a tus clases de otro proyecto. – user919860

Respuesta

130
Class<?> cls = Class.forName(className); 

Pero su className debería ser completamente calificado - es decir com.mycompany.MyClass

+2

está lanzando la Excepción de ClassNotFound – Steven

+0

y luego la clase no está en el classpath o no está pasando el nombre de clase completamente calificado, p. com.mycompany.project.ClassName –

+0

¿qué valor de 'className' está pasando? ¿Hay tal clase en tu classpath? – Bozho

3

eeh .. Class.forName (nombre de la clase String)?

+0

¿Puedes hacer esto también para las Subclases? – Gobliins

2

No estoy seguro de lo que está preguntando, pero ... Class.forname, tal vez?

+0

es throwing ClassNotFound Exception – Steven

+0

¿Qué ocurre si la clase está en un proyecto diferente? – Steven

+0

Veo que nadie responde su pregunta. No debería importar si está en otro proyecto, siempre y cuando el compilador sepa dónde buscar. Dado que probablemente esté usando un IDE, probablemente dependa únicamente del IDE. Lo bueno de las referencias, usted sabe que todas las clases a las que hace referencia desde las bibliotecas de Java no están en su proyecto, ¿verdad? Pero, el compilador sabe dónde buscarlos porque sabe que están referenciados externamente. Parece que necesita aprender programación básica de Java cuando está intentando una programación Java avanzada. : | – user919860

6

Usted puede utilizar el método de forNameClass:

   Class cls = Class.forName(clsName); 
       Object obj = cls.newInstance(); 
+0

Estoy trabajando con un proyecto web dinámico en eclipse. Estoy usando el código anterior para buscar una Clase. pero devuelve ClassNotFoundException, cuando utilizo una variable de cadena como esta: 'String clsName =" com.mydoamin.className "; Clase CLS = Class.forName (clsName); ' Si es codificar el nombre de clase completo como parámetro entonces las cosas funcionan bien. ¿Cualquier sugerencia? –

+0

@djthequest Si nuestra variable 'clsName' contiene el nombre de clase completamente calificado, no debería haber diferencia entre usarlo y la cadena codificada. Es posible que no tenga la clase que necesita en el classpath. Puede ser útil crear una instancia de una clase común del mismo contenedor en el código de inicio para asegurarse de que la biblioteca esté presente en el cargador de clases. – rsp

+0

gracias por su respuesta, pero en lugar de la variable si código duro la cadena, funciona aletas, significa que las clases están en la ruta de clase, ¿verdad? Más tarde descubrí que el método 'Class.forName()' espera una variable 'final'. Una variable simple no funcionará. –

32
String clsName = "Ex"; // use fully qualified name 
Class cls = Class.forName(clsName); 
Object clsInstance = (Object) cls.newInstance(); 

Compruebe el rastro de Java Tutorial sobre Reflexión en http://java.sun.com/docs/books/tutorial/reflect/TOC.html para más detalles.

+3

La respuesta de Bozho podría tener más puntos, pero creo que la tuya es más descriptiva. PS. ¿Por qué te llamas JuanZe? Casi suena como una mezcla entre español y chino. :RE. ¿Hay algún tipo de significado inteligente detrás de esto? – user919860

+0

@ user919860, debe leerlo al revés. – Pacerier

+0

Estoy trabajando con un proyecto web dinámico en eclipse. Estoy usando el código anterior para buscar una Clase. pero devuelve ClassNotFoundException, cuando utilizo una variable de cadena como esta: 'String clsName =" com.mydoamin.className "; Clase CLS = Class.forName (clsName); ' Si es codificar el nombre de clase completo como parámetro entonces las cosas funcionan bien. ¿Cualquier sugerencia? –

4

Puede obtener la referencia de clase de cualquier clase durante el tiempo de ejecución mediante el concepto de reflexión de Java.

Compruebe el siguiente código. Explaianation se da a continuación Aquí es un ejemplo que utiliza la clase volvió a crear una instancia de AClass:

package com.xyzws;class AClass { 
     public AClass() { 
     System.out.println("AClass's Constructor"); 
    } 
    static { 
     System.out.println("static block in AClass"); 
    } 
    } 
    public class Program { 
    public static void main(String[] args) { 
     try {  
    System.out.println("The first time calls forName:"); 
     **Class c = Class.forName("com.xyzws.AClass");  
    AClass a = (AClass)c.newInstance();  
     System.out.println("The second time calls forName:"); 
     Class c1 = Class.forName("com.xyzws.AClass");** 
     } catch (ClassNotFoundException e) { 
       ... } catch (InstantiationException e) { 
       ... } catch (IllegalAccessException e) { 
       ... }  
     } 
    } 


    The output is 
    The first time calls forName: 
    static block in AClass 
    AClass's Constructor 
    The second time calls forName: 
     //Calss has been loaded so there is not "static block in AClass" printing outThe second 

El Exaplaination está por debajo

Class.forName se llama para obtener un objeto de clase

Al utilizar el objeto de clase, estamos creando la nueva instancia de la clase.

Cualquier duda sobre esto, hágamelo saber

+0

¿Qué pasa si la clase está en proyecto diferente? – Steven

+1

¿Puede obtener un archivo jar de ese estado y especificar el nombre de clase algo así como Class.forName ("oracle.jdbc.driver.OracleDriver") – gmhk

Cuestiones relacionadas