【发布时间】:2012-04-24 14:03:03
【问题描述】:
如果我的应用程序中有一个名为 TestActivity 的 Activity 类,有没有办法通过其名称获取它的类,如下例所示:
Class<?> c = getClassByName("TestActivity");
【问题讨论】:
如果我的应用程序中有一个名为 TestActivity 的 Activity 类,有没有办法通过其名称获取它的类,如下例所示:
Class<?> c = getClassByName("TestActivity");
【问题讨论】:
改用forName..
类似的东西..
try {
Class<?> act = Class.forName("com.bla.TestActivity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
【讨论】:
Class<? extends SomeClass> 吗?
您可以使用Class::forName 获取未知类型的类对象。
如果要获取类型化的类,可以在Class::forName返回的类上使用Class::asSubclass:
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 的 json 是通用的,我们无法在 json 中添加像 Activity 这样的术语,所以这就是我们所做的
在所有Activity 或Viewcontrollers 的json 中,使用简单的名称,即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()
}
这样我可以很容易地用相同的方法管理多个类。我在回收站视图中使用它,我的每个单元格都导航到不同的活动。
【讨论】: