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?
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?
Class<?> cls = Class.forName(className);
Pero su className
debería ser completamente calificado - es decir com.mycompany.MyClass
eeh .. Class.forName (nombre de la clase String)?
¿Puedes hacer esto también para las Subclases? – Gobliins
No estoy seguro de lo que está preguntando, pero ... Class.forname, tal vez?
es throwing ClassNotFound Exception – Steven
¿Qué ocurre si la clase está en un proyecto diferente? – Steven
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
Usted puede utilizar el método de forName
Class
:
Class cls = Class.forName(clsName);
Object obj = cls.newInstance();
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? –
@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
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á. –
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.
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
@ user919860, debe leerlo al revés. – Pacerier
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? –
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
¿Qué pasa si la clase está en proyecto diferente? – Steven
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