如何将Class列表作为参数传递?

时间:2017-01-05 19:51:02

标签: java exception

我试图使用handleException方法,该方法可以使用异常对象和可接受的异常类列表来检查异常是否可接受并且可以重试。

void handleException(Exception e, String... acceptableExceptionNames)
      throws MyException {

    boolean isRetryable = false;

    for(String acceptableExceptionName: acceptableExceptionNames) {
      try {
        if (Class.forName(acceptableExceptionName).isInstance(e)) {
          isRetryable = true;
          break;
        }
      } catch (ClassNotFoundException e1) {
        continue;
      }
    }

    if (isRetryable) {
      // log retryable
    } else {
      // log error
    }

    throw new MyException(isRetryable, "Failed");
  }

我传入的参数是String... classNames而不是Class<? extends Exception> classes,因为如果我这样做的话:

void handleException(
    Exception e,
    Class<? extends Exception>... acceptableExceptions)
      throws MyException {
    for (Class acceptableException : acceptableExceptions) {
        if (e instanceOf acceptableException) {}
    }
}

IDE会抱怨unknown class acceptableException

任何人都知道是否有办法通过Class<?>?或者更好的方法是避免使用String classNamesClass.forName()

4 个答案:

答案 0 :(得分:6)

acceptableExceptions不是Class,而是Class[]。但是,您可以保留原始设计,只需直接使用Class个对象,而不是从字符串创建它们:

void handleException
        (Exception e, Class<? extends Exception>... acceptableExceptionNames)
        throws MyException {

    boolean isRetryable = false;

    for(Class<?> acceptableExceptionName: acceptableExceptionNames) {
        if (acceptableExceptionName.isInstance(e)) {
            isRetryable = true;
            break;
        }
    }

    if (isRetryable) {
        // log retryable
    } else {
        // log error
    }

    throw new MyException(isRetryable, "Failed");
}

编辑:
作为旁注,使用Java 8的流可以大大缩短此代码:

void handleException
        (Exception e, Class<? extends Exception>... acceptableExceptionNames)
        throws MyException {

    boolean isRetryable = 
        Arrays.stream(acceptableExceptionNames).anyMatch(x -> x.isInstance(e));

    if (isRetryable) {
        // log retryable
    } else {
        // log error
    }

    throw new MyException(isRetryable, "Failed");
}

答案 1 :(得分:2)

您不想检查eClass[]的实例,acceptableExceptions是什么,但如果它是的实例 acceptableExceptions数组引用的类。

为此,您需要迭代它们,并且需要使用反射方法Class.isInstance(Object obj)。正如javadoc所说:

  

此方法是Java语言instanceof运算符的动态等效项。

要防止编译器警告,您还需要向{1}}或@SafeVarargs方法添加static。否则,您需要向方法及其来电者添加final

@SuppressWarnings("unchecked")

答案 2 :(得分:1)

在我看来,如果通过执行这样的简单字符串比较,它会更容易做到:

private void handleException(Exception ex, String... acceptableException) {
    for (int x = 0; x < acceptableException.length; x++) {
        String[] exceptionClass = ex.getClass().toString().split(".");
        if (!acceptableException[x]
                .equals(exceptionClass[exceptionClass.length - 1])) {
            /* Exception Not Acceptable */
        }
    }

    /* Exception Acceptable */
}

答案 3 :(得分:-1)

使用以下检查

{{1}}