Якщо у моєму додатку є клас 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, і я написав наведені нижче утилітні методи для динамічного отримання активності
Щоб отримати назву класу (тобто, якщо ми пройдемо додому, ми повернемося назад 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()
}
Таким чином я можу легко керувати кількома класами одним і тим же методом. Я використовую це в режимі переробки, де кожна моя клітина переходить до іншої діяльності.