如果我的应用程序中有一个名为TestActivity的Activity类,是否可以通过名称来获取其类,如以下示例所示:
Class<?> c = getClassByName("TestActivity");
Answers:
使用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,其中包含屏幕和活动映射。由于这两个iOS / Android都Activity
使用json,因此我们无法在json中添加类似的术语,因此我们要做的是
在json中,对于allActivity
或Viewcontrollers
,请使用简单的名称,即for HomeActivity
,HomeViewController
我们将在json中使用“ Home”
在应用程序中,我们解析了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()
}
这样,我可以使用相同的方法轻松管理多个类。我在回收站视图中使用此视图,在该视图中,每个单元都导航到另一个活动。