Java 通过名称获取类

Java 通过名称获取类,java,android,class,Java,Android,Class,如果在我的应用程序中有一个名为TestActivity的活动类,是否有一种方法可以通过其名称获取其类,如本例所示: Class<?> c = getClassByName("TestActivity"); Class c=getClassByName(“测试活动”); 改用 像这样的 try { Class<?> act = Class.forName("com.bla.TestActivity"); } catch (ClassNotFoundExcept

如果在我的应用程序中有一个名为TestActivity的活动类,是否有一种方法可以通过其名称获取其类,如本例所示:

Class<?> c = getClassByName("TestActivity");
Class c=getClassByName(“测试活动”);
改用

像这样的

 try {
    Class<?> act = Class.forName("com.bla.TestActivity");
 } catch (ClassNotFoundException e) {
        e.printStackTrace();
}
试试看{
Class act=Class.forName(“com.bla.TestActivity”);
}catch(classnotfounde异常){
e、 printStackTrace();
}
似乎有例外。这只是为了扩大上述内容,以解决这一问题

try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}
可以使用获取未知类型的类对象。 如果要获取类型化类,可以在
class::forName
返回的类上使用:

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

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

  • 在所有
    活动
    视图控制器
    的json中,使用简单的名称,即
    HomeActivity
    HomeViewController
    我们将在json中使用“Home”

  • 在应用程序中,我们解析json,我编写了以下实用程序方法来动态获取活动

  • 获取类的名称(即如果我们通过Home,我们将返回
    com.package.HomeActivity

    现在从字符串中获取类

            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()
            }
    

    这样我就可以用相同的方法轻松地管理多个类。我在“回收者”视图中使用此选项,在该视图中,我的每个单元格都导航到不同的活动。

    您还必须提供完整的程序包名称。例如:com.bla.TestActivity作为Class.forname的参数,您是否也可以做一些事情来接收
    Class@Gobliins否-编译器不能保证您将得到什么类型的类,因此它会给您一个类。如果你知道你将得到什么类型的类,你将不得不强制转换它(即使如此,你仍然会得到未经检查的强制转换警告,因为强制转换是不安全的)。@Gobliins查看如何获得某个类型的子类。通常这样回答的方法是编辑他们的答案。尽管Java中存在大量的异常(而您的代码只是忽略了它),但一条注释就足以解决它。@crazyhatfish-似乎Patrick除了发布自己的答案之外,可能没有做任何有帮助的事情的特权。@amess哎哟,您的权利,我忘记了评论需要代表。谢谢你纠正我。请注意,你的答案是在Kotlin;)可能会稍微修改一下以使其成为Java?@LMD可能大多数搜索答案的android开发人员都需要kotlin版本,而不是Java;)@RuslanBerozov op将该问题标记为[java],因此我希望至少有一个java版本(当然,附加Kotlin也可以)。@LMD抱歉,但op在2012年发布了一个问题。很难想象他当时知道科特林。问题的关键是这个问题也被标记为[android],现在我希望Kotlin版本更好。
    
            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()
            }