缺少Class.isInstance()的GWT解决方法

时间:2014-04-20 23:58:11

标签: java class gwt instanceof

我试图在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.javagetSuperclass()方法会包含isClassMetadataEnabled()的检查,可能会返回false(但我不知道在哪些情况下),因为它包含评论说&#34;这个主体可能被编译器取代&#34;。

还是有更好的方法来完成这项工作吗?

2 个答案:

答案 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;
   }   
}