0

我正在为 Android 开发一个测试库。

我想要做的是创建一个方法,从它的类名创建一个活动并返回活动实例。

例如,我收到了这个类的类名SampleActivity,这个类作为一个活动扩展了android的Activity类。那么我需要返回的是一个实例SampleActivity

为清楚起见,尝试将其移除。

这就是我现在所拥有的

public static Class<? extends Activity> createActivity(String activityName){

    Class<? extends Activity> clazz = null;
    Class<? extends Activity> activity = null;

    clazz = (Class<? extends Activity>) Class.forName(activityName);
    activity = clazz.newInstance(); // incompatible type

    return activity;
}
4

2 回答 2

0

将您的活动变量更改为活动类型而不是类。

您还应该更改方法声明,例如:

public <T extends Activity> T createActivity(String className)

如果你只知道类是一个字符串,这是你能做的最好的事情,消费者只会知道返回的对象是一个活动。如果需要更具体的类型,则需要对其进行强制转换。看到您似乎只将类名作为字符串,您的调用代码甚至如何知道要转换为的类型。

现在,如果您实际上在编译时具有类类型,则可以像这样定义方法:

public <T extends Activity> createActivity(Class<T> clazz){
    return clazz.newInstance();
}

但我的印象是你在编译时没有具体的类。

于 2013-05-20T10:59:54.203 回答
0

我想如果我理解正确,这就是你需要做的:

public static Activity createActivity(String activityName)
{
    Class<? extends Activity> c = (Class<? extends Activity>) Class.forName(activityName);
    Activity activity = c.newInstance();
    return activity;
}

您可以按如下方式使用此类:

SampleActivity sampleActivity = (SampleActivity) createActivity("com.abc.SampleActivity");

或者

如果你想返回Class然后使用

public static Class<? extends Activity> createActivity(String activityName)
{
    Class<? extends Activity> clazz = null;
    Class<? extends Activity> activity = null;

    clazz = (Class<? extends Activity>) Class.forName(activityName);
    activity = clazz.newInstance(); 
    return activity.class;
}

确保activityName是类的完全限定名,并且所代表的类activityName应该是 的子类Activity

于 2013-05-20T11:03:11.870 回答