Получение classа по его названию

Если у меня есть class Activity, называемый TestActivity в моем приложении, есть способ получить его class по его имени, как в этом примере:

Class c = getClassByName("TestActivity"); 

Вместо этого используйте forName .

что-то вроде этого..

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

Класс.forName, похоже, имеет исключения. Это просто для того, чтобы расширить эту проблему для решения этой проблемы.

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

Class::forName можно использовать для получения объекта classа неизвестного типа. Если вы хотите получить типизированный class, вы можете использовать Class::asSubclass для classа, возвращаемого Class::forName :

 Class activityClass = Class.forName("com.example.TestActivity") .asSubclass(Activity.class); 

Конечно, вам также придется обрабатывать множество различных типов исключений. Как обычно при рассмотрении рефлексии.

Возможно, это не самый релевантный ответ на ваш вопрос, но, как правило, плохо записывать литералы classа как строки. Может быть, лучше использовать

 Class act = TestActivity.class; 

синтаксис.

У меня также было подобное требование, у меня был json, исходящий из бэкэнд, который содержит экран и отображение активности. Поскольку json в общем для iOS / Android, мы не могли добавить такие термины, как Activity в json, так это то, что мы сделали

  1. В json для всех Activity или Viewcontrollers используйте простые имена, то есть для HomeActivity и HomeViewController мы будем использовать «Home» в json

  2. В приложении мы разбираем json, и я написал приведенные ниже методы утилиты, чтобы динамически активировать активность

Чтобы получить имя classа (т. com.package.HomeActivity Если мы перейдем домой, мы com.package.HomeActivity )

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

Теперь, чтобы получить class из строки

  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() } 

Таким образом, я могу легко управлять несколькими classами одним и тем же методом. Я использую это в представлении recycler, где каждая моя ячейка переходит к другому действию.

  • pointerIndex вне диапазона Android multitouch
  • В чем разница между статическим методом и нестатическим методом?
  • Состояние флажка ListView Viewholder
  • почему переменная экземпляра суперclassа не переопределяется в методе подclassа
  • Действительно ли невозможно защитить приложения Android от обратного проектирования?
  • Как преобразовать currentTimeMillis в формат чтения?
  • Сначала необходимо выпустить команду STARTTLS
  • В чем разница между ServletContextHandler.setResourceBase и ResourceHandler.setResourceBase при использовании встроенного контейнера Jetty?
  • Как отформатировать продолжительность в java? (например, формат H: MM: SS)
  • Android: как обращаться с кнопкой
  • Как использовать StringUtils в Java?
  • Давайте будем гением компьютера.