Получение classа по его названию
Если у меня есть class Activity, называемый TestActivity в моем приложении, есть способ получить его class по его имени, как в этом примере:
Class c = getClassByName("TestActivity");
- Как установить задержку в Android?
- Html.ImageGetter TextView
- Почему имена файлов в Java такие же, как и имя открытого classа?
- Как сделать пакетный режим доступным для камеры
- Хостинг исполняемого файла в приложении Android
- ошибка идентификации устройства Android
- Можем ли мы предположить значения массива по умолчанию в Java? например, предположим, что массив int задан для всех нhive?
- Печать целого числа в двоичном формате в Java
- Android - Как сделать скриншот программным
- Как разобрать JSON из Java HTTPResponse?
- Неподдерживаемая версия major.minor 49.0
- Метод сравнения нарушает его общий контракт в Java 7
- Как проверить, работает ли приложение на Android?
Вместо этого используйте 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, так это то, что мы сделали
-
В json для всех
Activity
илиViewcontrollers
используйте простые имена, то есть дляHomeActivity
иHomeViewController
мы будем использовать «Home» в json -
В приложении мы разбираем 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, где каждая моя ячейка переходит к другому действию.