Java 检查动态创建的类是否为活动

Java 检查动态创建的类是否为活动,java,android,class,instance,Java,Android,Class,Instance,我的应用程序有几个活动和“开始活动”按钮列表。我为此创建了一个自定义视图。为了不需要处理click处理程序和switch语句,我可以在布局的XML文件中设置custom:start\u activity=“.OtherActivity”属性 当然,很好的计划。但我必须为此提供错误检测。start\u activity中键入的字符串必须是有效的类名,并且该类必须是activity的子类OtherActivity是属于AppCompatActivity子类的类的子类 这就是我尝试过的: String

我的应用程序有几个活动和“开始活动”按钮列表。我为此创建了一个自定义视图。为了不需要处理click处理程序和switch语句,我可以在布局的XML文件中设置
custom:start\u activity=“.OtherActivity”
属性

当然,很好的计划。但我必须为此提供错误检测。
start\u activity
中键入的字符串必须是有效的类名,并且该类必须是
activity
的子类
OtherActivity
是属于
AppCompatActivity
子类的类的子类

这就是我尝试过的:

String name = array.getString(R.styleable.MyView_start_activity);
if (name == null)
    throw new IllegalArgumentException("name attribute must be set.");
final String className = context.getPackageName() + activity;
try {
    Class<?> check = Class.forName(className); //, false, getClass().getClassLoader()); // create only at click later
    if (!Activity.class.isInstance(check))
        throw new IllegalArgumentException(className + " is not a valid activity.");
} catch (ClassNotFoundException e) {
    throw new IllegalArgumentException(className + " is not a valid class.");
}
String name=array.getString(R.styleable.MyView\u start\u活动);
if(name==null)
抛出新的IllegalArgumentException(“必须设置名称属性”);
最后一个字符串className=context.getPackageName()+活动;
试一试{
Class check=Class.forName(className);//,false,getClass().getClassLoader();//仅在以后单击时创建
如果(!Activity.class.isInstance(检查))
抛出新的IllegalArgumentException(className+“不是有效的活动”);
}catch(classnotfounde异常){
抛出新的IllegalArgumentException(className+“不是有效的类。”);
}
但是,
isInstance
总是返回false,因此它总是抛出异常。我还尝试了
isAssignableFrom
,以及不同的参数/类变体。给定的字符串是一个有效类,
ClassNotFoundException
不会被抛出,在调试器中,我可以在
check
的超类树中看到
Activity
。我不知道我做错了什么?

isInstance()和instanceOf将不起作用,除非该检查被实例化/是一个对象

你可以

if (!Activity.class.isInstance(check.newInstance()))


假设为该检查实例化对象是安全的。

ClassA instanceof ClassB
使用if(check instanceof Activity)是否有效?否
instanceof
执行静态检查,因此我无法使用它<代码>类不能在编译时强制转换。我认为check-or-Class.forName(className)永远不会被实例化。您可以尝试check.newInstance()?@VinNorman Idneed。我是按照答案做的,它没有包括
newInstance()
。现在看起来很好,谢谢。把它作为答案贴出来,我会接受的。
if (!(check.newInstance() instanceof Activity))