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

Mar*_* A. 9 java gwt class instanceof

我正在尝试在GWT中编写一个作业调度系统,它维护一系列例外(Class<? extends Exception>[] exceptions),可以通过重试作业来解决.为此,如果调度程序捕获异常,我需要查看此异常是否与数组中的某个类匹配.所以,我希望有这样的功能:

boolean offerRetry(Exception exception) {
    for (Class<? extends Exception> e: exceptions)
        if (e.isInstance(exception)) return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

不幸的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;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法不支持对接口进行测试,我也不知道如何解决这个问题,因为Class.getInterfaces()它也是不可用的.但是这种方法Class.isInstance在所有其他情况下至少与Java的工作方式相同,不包括接口吗?具体来说,如果我查看GWT的Class.java源代码,该getSuperclass()方法包含一个检查isClassMetadataEnabled(),可能会返回false(但我不知道在哪些情况下),因为它包含一条评论说"这个主体可能被替换为编译器".

还是有更好的方法来做到这一点?

小智 5

我使用以下代码:

 public static <T> boolean isInstanceOf(Class<T> type, Object object) {
    try {
         T objectAsType = (T) object;
     } catch (ClassCastException exception) {
         return false;
     }
     return true;
 }
Run Code Online (Sandbox Code Playgroud)


dex*_*ter 0

也许这样的事情会有所帮助:

boolean offerRetry(Exception exception) {
   try{
      throw exception;
   } catch (SpecException se) {
      return true;
   } catch (SpecException1 se1) {
      return true;
   ...
   } catch (Exception e) {
      return false;
   }   
}
Run Code Online (Sandbox Code Playgroud)

这取决于您如何构造异常数组。如果 java 7 的东西工作正常,那么你可以将所有异常放在一个 catch 中:

boolean offerRetry(Exception exception) {
   try{
      throw exception;
   } catch (SpecException | SpecException1 | ... se) {
      return true;
   } catch (Exception e) {
      return false;
   }   
}
Run Code Online (Sandbox Code Playgroud)