2012-04-12 21 views
54

Si tengo una tipo de actividad llamada TestActivity en mi solicitud, ¿hay una manera de conseguir su clase por su nombre como en este ejemplo:clase por su nombre

Class<?> c = getClassByName("TestActivity"); 
+0

Por favor, selecciona la respuesta correcta y cierra la publicación –

Respuesta

112

uso forName lugar ..

algo como esto ..

try { 
    Class<?> act = Class.forName("com.bla.TestActivity"); 
} catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
} 
+25

También tienes que dar el nombre completo del paquete. por ejemplo: com.bla.TestActivity como argumento para Class.forName – Richie

+1

¿Puedes hacer algo para recibir 'Class '? – Gobliins

+0

@Gobliins No, el compilador no puede garantizar el tipo de clase que va a obtener, por lo que le otorga una Clase . Si sabes qué tipo de clase vas a tener, deberás lanzarla (incluso así, recibes advertencias de lanzamiento sin marcar porque el lanzamiento no es seguro). – Dylanthepiguy

4

El Class.forName parece tener excepciones en él. Esto es solo para ampliar lo anterior para abordar este problema.

try { t = Class.forName("com.package.classname"); } catch (Exception ignored){} 
+0

La manera habitual de SO de responder así sería ** editar ** su respuesta. Aunque como las excepciones son abundantes en Java (y su código simplemente lo ignora), un ** comentario ** sería suficiente para abordarlo. – crazyhatfish

+5

@crazyhatfish - Parece que Patrick puede no haber tenido los privilegios para hacer algo útil _except_ publicar su propia respuesta. – amess

+1

@amess Vaya, tiene razón, olvidé que los comentarios necesitan representante. Gracias por corregirme. – crazyhatfish

0

Puede utilizar Class::forName para obtener un objeto de clase de tipo desconocido. Si desea obtener una clase con tipo, puede utilizar Class::asSubclass en la clase devuelta por Class::forName:

Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity") 
               .asSubclass(Activity.class); 

Por supuesto, también tendrá que manejar un montón de diferentes tipos de excepciones. Como es habitual cuando se trata de la reflexión.

1

Puede que no sea la respuesta más relevante para su pregunta, pero en general es malo codificar literales de nombre de clase como cadenas. Podría ser mejor usar

Class<?> act = TestActivity.class; 

sintaxis.

Cuestiones relacionadas