91

如果我的应用程序中有一个名为 TestActivity 的 Activity 类,有没有办法通过它的名称来获取它的类,如下例所示:

Class<?> c = getClassByName("TestActivity");
4

4 回答 4

171

改用forName ..

像这样的东西..

 try {
    Class<?> act = Class.forName("com.bla.TestActivity");
 } catch (ClassNotFoundException e) {
        e.printStackTrace();
}
于 2012-04-12T08:26:15.980 回答
9

您可以使用Class::forName来获取未知类型的类对象。如果你想获得一个类型化的类,你可以Class::asSubclass在返回的类上使用Class::forName

Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
                                               .asSubclass(Activity.class);

当然,您还必须处理一堆不同类型的异常。像往常一样处理反射。

于 2018-01-05T13:25:22.307 回答
6

Class.forName似乎有例外。这只是对上述内容进行扩展以解决此问题。

try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}
于 2015-04-19T22:31:11.097 回答
2

我也有类似的要求,我有一个来自后端的 json,其中包含屏幕和活动映射。由于 iOS/Android 的 json 是通用的,我们不能Activity在 json 中添加类似的术语,所以这就是我们所做的

  1. 在 json for all ActivityorViewcontrollers中,使用简单的名称,即 for HomeActivityHomeViewController我们将在 json 中使用“Home”

  2. 在应用程序中,我们解析 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()
        }

这样我就可以用同样的方法轻松管理多个类。我在回收站视图中使用它,我的每个单元格都导航到不同的活动。

于 2018-08-12T11:02:58.323 回答