Если в моем приложении есть класс Activity с именем TestActivity, есть ли способ получить его класс по имени, как в этом примере:
Class<?> c = getClassByName("TestActivity");
Ответы:
вместо этого используйте forName ..
что-то вроде этого..
try {
Class<?> act = Class.forName("com.bla.TestActivity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class<? extends SomeClass>
?
Вы можете использовать Class::forName
для получения объекта класса неизвестного типа. Если вы хотите получить типизированный класс, вы можете использовать Class::asSubclass
класс, возвращаемый Class::forName
:
Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
.asSubclass(Activity.class);
Конечно, вам также придется обрабатывать множество разных типов исключений. Как это обычно бывает с отражением.
У Class.forName есть исключения. Это просто дополнение к вышесказанному для решения этой проблемы.
try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}
У меня также было аналогичное требование, у меня был json, исходящий из бэкэнда, который содержит экран и отображение активности. Поскольку json является общим для iOS / Android, мы не могли добавлять такие термины, как Activity
в json, поэтому вот что мы сделали
В json для всех Activity
или Viewcontrollers
используйте простые имена, т.е. for, HomeActivity
и HomeViewController
мы будем использовать "Home" в json.
В приложении мы анализируем json, и я написал следующие служебные методы для динамического получения активности.
Чтобы получить имя класса (т.е. если мы пройдем Home, мы вернемся com.package.HomeActivity
)
fun getClassInfoFor(name: String, context: Context):String{
var str = "${context.getPackageName()}.${name}Activity"
return str
}
Теперь, чтобы получить класс из строки
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()
}
Таким образом, я могу легко управлять несколькими классами одним и тем же методом. Я использую это в представлении ресайклера, где каждая моя ячейка переходит к другому действию.