我正在尝试在 GWT 中编写一个作业调度系统,该系统维护一个异常数组 ( Class<? extends Exception>[] exceptions
),这些异常可以通过重试作业来解决。为此,如果调度程序捕获到异常,我需要查看此异常是否与数组中的类之一匹配。所以,我想要一个这样的功能:
boolean offerRetry(Exception exception) {
for (Class<? extends Exception> e: exceptions)
if (e.isInstance(exception)) return true;
return false;
}
不幸的是Class.isInstance(...)
在 GWT 中不可用。
有什么好的解决方法吗?我目前最好的猜测是这样的:
public static boolean isInstance(Class<?> clazz, Object o) {
if ((clazz==null) || (o==null)) return false;
if (clazz.isInterface()) throw new UnsupportedOperationException();
Class<?> oClazz = o.getClass();
while (oClazz!=null) {
if (oClazz.equals(clazz)) return true;
oClazz = oClazz.getSuperclass();
}
return false;
}
不幸的是,这种方法不支持针对接口(interface)进行测试,我也不知道如何解决这个问题 Class.getInterfaces()
也不可用。但是这种方法至少会像 Java 的 Class.isInstance
一样工作吗?在所有其他情况下,不包括接口(interface)?具体来说,如果我看 GWT's source for Class.java , getSuperclass()
方法包含对 isClassMetadataEnabled()
的检查,它可能会返回 false(但我不知道在哪种情况下),因为它包含一条注释“This body may be replaced by the compiler”。
或者是否有更好的方法完全做到这一点?
最佳答案
我使用以下代码:
public static <T> boolean isInstanceOf(Class<T> type, Object object) {
try {
T objectAsType = (T) object;
} catch (ClassCastException exception) {
return false;
}
return true;
}
关于java - 缺少 Class.isInstance() 的 GWT 解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23188913/