我的应用程序有几个 Activity ,以及“开始 Activity ”按钮列表。我为此创建了一个自定义 View 。为了不需要处理点击处理程序和切换语句,我可以在布局的 XML 文件中设置一个 custom:start_activity=".OtherActivity"
属性。
当然,不错的计划。但我必须为此提供错误检测。 start_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.");
}
但是,isInstance
总是返回 false,所以它一直抛出异常。我还尝试了 isAssignableFrom
和不同的参数/类变体。给定的字符串是一个有效的类,ClassNotFoundException
没有被抛出,在调试器中,我可以在 check
的父类(super class)树中看到 Activity
.我不知道,我做错了什么?
最佳答案
isInstance() 和 instanceOf 将不起作用,除非检查被实例化/是一个对象。
你可以做
if (!Activity.class.isInstance(check.newInstance()))
或
if (!(check.newInstance() instanceof Activity))
假设为此检查实例化您的对象是安全的。
关于java - 检查动态创建的类是否是一个 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46990421/