我试图在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;
}
不幸的是,这种方法不支持对接口进行测试,而且由于Class.getInterfaces()
也不可用,我也不知道如何解决这个问题。但是,除了接口之外,这种方法在所有其他情况下至少与Java Class.isInstance
的工作方式相同吗?具体来说,如果我查看GWT's source for Class.java,getSuperclass()
方法会包含isClassMetadataEnabled()
的检查,可能会返回false(但我不知道在哪些情况下),因为它包含评论说&#34;这个主体可能被编译器取代&#34;。
还是有更好的方法来完成这项工作吗?
答案 0 :(得分:4)
我使用以下代码:
public static <T> boolean isInstanceOf(Class<T> type, Object object) {
try {
T objectAsType = (T) object;
} catch (ClassCastException exception) {
return false;
}
return true;
}
答案 1 :(得分:0)
也许这样的事情会有所帮助:
boolean offerRetry(Exception exception) {
try{
throw exception;
} catch (SpecException se) {
return true;
} catch (SpecException1 se1) {
return true;
...
} catch (Exception e) {
return false;
}
}
这取决于你如何构造异常数组。如果java 7的东西正常工作,那么你可以将所有异常放在一个catch中:
boolean offerRetry(Exception exception) {
try{
throw exception;
} catch (SpecException | SpecException1 | ... se) {
return true;
} catch (Exception e) {
return false;
}
}