Obtener clase por su nombre

Si tengo una clase de actividad llamada TestActivity en mi aplicación, ¿hay alguna forma de obtener su clase por su nombre como en este ejemplo?

Class c = getClassByName("TestActivity"); 

use forName en su lugar …

algo como esto..

  try { Class act = Class.forName("com.bla.TestActivity"); } catch (ClassNotFoundException e) { e.printStackTrace(); } 

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

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

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

 Class 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.

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

 Class act = TestActivity.class; 

syntax.

También tuve un requisito similar, tuve un json que venía del backend que contiene la pantalla y el mapeo de actividad. Desde el json en común para iOS / Android, no pudimos agregar términos como Activity al json, así que esto es lo que hicimos

  1. En json para todos los Viewcontrollers Activity o Viewcontrollers , use nombres simples, es decir, para HomeActivity y HomeViewController usaremos “Home” en el json

  2. En la aplicación, analizamos el json y escribí los siguientes métodos de utilidad para obtener la actividad de forma dinámica

Para obtener el nombre de la clase (es decir, si pasamos a Casa, obtendremos com.package.HomeActivity )

  fun getClassInfoFor(name: String, context: Context):String{ var str = "${context.getPackageName()}.${name}Activity" return str } 

Ahora para obtener clase de la cadena

  try { val className = Utilties.getClassInfoFor(activityNameFromJSON, context) val fetchedClass = Class.forName(className) val showDetailsIntent = Intent(context, fetchedClass) context.startActivity(showDetailsIntent) } catch (e: ClassNotFoundException) { e.printStackTrace() } 

De esta forma puedo administrar fácilmente múltiples clases con el mismo método. Utilizo esto en una vista de reciclador donde cada una de mis celdas navega a una actividad diferente.