入门级由它的名字入门级由它的名字(Getting class by its name)

2019-05-13 12:45发布

如果我在我的应用程序调用测试活动的Activity类,是有办法通过其名称来获得同级车就像这个例子:

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

Answer 1:

使用的forName代替..

这样的事情..

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


Answer 2:

该的Class.forName似乎有它的例外。 这仅仅是在上面的扩大来解决这个问题。

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


Answer 3:

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

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

当然,你也必须处理很多不同类型的异常的。 与反射打交道时,通常。



Answer 4:

我也有过类似的要求,我只好从包含屏幕和活动映射后端来一个JSON。 由于共同的JSON两个的iOS / Android的,我们不可能添加了如Activity为JSON,所以这是我们所做的事情

  1. 在JSON所有ActivityViewcontrollers ,使用简单的名称,即对HomeActivityHomeViewController我们将在JSON使用“家”

  2. 在应用中,我们解析JSON,我已经写了下面的实用方法来获取动态活动

要获取类的名称(即,如果我们通过主页,我们会尽快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()
        }

这样,我可以很容易地用同样的方法管理多类。 我在我的每一个细胞导航到不同的活动回收者视图使用此。



Answer 5:

它可能不是你的问题最相关的答案,但它是普遍不好硬编码类名称文字为字符串。 这可能是更好的使用

Class<?> act = TestActivity.class;

句法。



文章来源: Getting class by its name