【问题标题】:Getting class by its name按名称获取课程
【发布时间】:2012-04-24 14:03:03
【问题描述】:

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

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

【问题讨论】:

    标签: java android class


    【解决方案1】:

    改用forName..

    类似的东西..

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

    【讨论】:

    • 您还必须提供完整的包名。例如:com.bla.TestActivity 作为 Class.forName 的参数
    • 你也可以做点什么来接收Class&lt;? extends SomeClass&gt; 吗?
    • @Gobliins 不——编译器不能保证你会得到什么样的类,所以它给你一个类>。如果你知道你将获得什么样的课程,你将不得不施放它(即使如此,你也会收到未经检查的施放警告,因为施放不安全)。
    • @Gobliins 查看my answer 了解如何获取特定类型的子类。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      Class.forName 似乎有例外。这只是为了解决这个问题。

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

      【讨论】:

      • SO 这样回答的通常方法是编辑他们的答案。尽管由于 Java 中有大量异常(而您的代码只是忽略了它),但 注释 就足以解决它。
      • @crazyhatfish - 似乎帕特里克可能没有特权做任何有用的事情除了发布他自己的答案。
      • @amess 哎呀,你说得对,我忘了 cmets 需要代表。感谢您纠正我。
      【解决方案4】:

      我也有类似的要求,我有一个来自后端的 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()
              }
      

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

      【讨论】:

      • 请注意,您的答案是在 Kotlin 中;)可能会稍微修改一下以使其成为 Java 吗?
      • @LMD 可能大多数寻找答案的 android 开发人员需要 kotlin 版本,而不是 java ;)
      • @RuslanBerozov 该操作已将问题标记为 [java] 所以我希望至少有一个 Java 版本(当然,附加 Kotlin 也可以)。
      • @LMD 抱歉,但是 op 在 2012 年发布了一个问题。很难想象他当时了解 Kotlin。关键是这个问题也被标记为 [android],现在我更希望 Kotlin 版本。
      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 2018-05-29
      • 2012-05-30
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多