以名字命名

时间:2012-04-12 08:23:59

标签: java android class

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

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

5 个答案:

答案 0 :(得分:136)

使用forName代替..

像这样......

 try {
    Class<?> act = Class.forName("com.bla.TestActivity");
 } catch (ClassNotFoundException e) {
        e.printStackTrace();
}

答案 1 :(得分:5)

Class.forName似乎有例外。这只是为了扩展上述内容以解决这个问题。

try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}

答案 2 :(得分:4)

您可以使用Class::forName来获取未知类型的类对象。 如果要获取类型化的类,可以对Class::forName返回的类使用Class::asSubclass

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

当然,您还必须处理一堆不同类型的异常。与处理反思时一样。

答案 3 :(得分:1)

我也有类似的要求,我有一个来自后端的json,其中包含屏幕和活动映射。由于这两个iOS / Android都使用json,因此我们无法在json中添加Activity之类的术语,所以我们做到了

  1. 在所有ActivityViewcontrollers的json中,使用简单的名称,即对于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()
        }

这样,我可以使用同一方法轻松管理多个类。我在回收站视图中使用此视图,在该视图中,每个单元都导航到其他活动。

答案 4 :(得分:0)

它可能不是您的问题最相关的答案,但将类名文字硬编码为字符串通常是不好的。使用

可能更好
Class<?> act = TestActivity.class;

语法。