通过名称获取课程


81

如果我的应用程序中有一个名为TestActivity的Activity类,是否可以通过名称来获取其类,如以下示例所示:

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

Answers:


158

使用forName代替。

像这样

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

30
您还必须提供完整的软件包名称。例如:com.bla.TestActivity作为Class.forName的参数
Richie

1
您还能做些什么来接受Class<? extends SomeClass>吗?
Gobliins

@Gobliins否-编译器无法保证您将获得哪种类,因此它为您提供了Class <?>。如果您知道要获得哪种类型的课程,则必须强制转换(即使仍然,由于强制转换不安全,您也会收到未经检查的强制转换警告)。
Dylanthepiguy '17

@Gobliins看看关于如何获取某种类型的子类的答案
raphinesse

6

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

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

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


6

的Class.forName似乎有它的例外。这仅仅是为了解决上述问题而在上面进行扩展。

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

SO这样回答的通常方法是编辑他们的答案。尽管由于Java中有很多异常(并且您的代码只是忽略了异常),所以注释足以解决它。
crazyhatfish

7
@crazyhatfish -这好像帕特里克可能没有权限做任何有用的,除了交了自己的答案。
2015年

3
@amess糟糕,您的权利,我忘了需要代表的评论。感谢您纠正我。
crazyhatfish

2

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

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

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


请注意,您的答案是Kotlin的;)可能要对其稍作改动以使其成为Java?
LMD

@LMD可能大多数搜索答案的android开发人员都需要kotlin版本,而不是java;)
Ruslan Berozov

@RuslanBerozov该操作员将此问题标记为[java],因此我希望至少有Java版本(当然,另外的Kotlin也可以)。
LMD

@LMD对不起,但是op在2012年发布了一个问题。很难想象他当时了解Kotlin。关键是该问题也被标记为[android],如今,我希望Kotlin版本更好。
Ruslan Berozov

-2

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

Class<?> act = TestActivity.class;

句法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.