如何抛出通过反射创建的Exception类的实例?

时间:2015-10-27 00:20:09

标签: java exception reflection

我正在尝试创建一个函数,该函数根据您传入的类型抛出异常。

private void myFunc(Class<?> exceptionType) {
   ...do some work...
   throw new exceptionOfTypeExceptionTypePassedIn(newMessage);
}

你能这样做吗?

3 个答案:

答案 0 :(得分:7)

首先,throw语句仅适用于Throwable或其子类型的引用表达式。因此,传递给throw的表达式必须具有该类型。您可以通过为exceptionType参数提供绑定来实现此目的。

private void myFunc(Class<? extends Throwable> exceptionType) {

如果您现在想要限制Throwable子类型的类型,也可以这样做。

如果是Exception,则需要throws声明

private void myFunc(Class<? extends Exception> exceptionType) throws Exception {

如果是RuntimeException,则不会

private void myFunc(Class<? extends RuntimeException> exceptionType) {

根据您的需要,您可能实际上使该方法通用。它会看起来像这样

private <T extends Throwable> void myFunc(Class<T> exceptionType) throws T {

对于实际的反射逻辑,您假设相应的类型具有接受String参数的可访问构造函数。如果没有,Java将抛出自己的各种异常。你需要处理这些。

潜在的解决方案如下所示(Class#getConstructorjavadocConstructor#newInstancejavadoc

private <T extends Throwable> void myFunc(Class<T> exceptionType) throws T {
    final String message = "some message";
    try {
        throw exceptionType.getConstructor(String.class).newInstance(message);
    } catch (InstantiationException e) {
        e.printStackTrace();
        // rethrow
    } catch (IllegalAccessException e) {
        e.printStackTrace();
        // rethrow
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        // rethrow
    } catch (InvocationTargetException e) {
        e.printStackTrace();
        // rethrow
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
        // rethrow
    } catch (SecurityException e) {
        e.printStackTrace();
        // rethrow
    }
}

显然,您可以将所有这些异常类型折叠为多捕获语句。

请注意,如果您传入的异常类型是现有catch语句中提到的异常类型之一,则会吞下它,即。没有抛出。您还可以在throws声明中添加所有这些声明。

private static <T extends Throwable> void myFunc(Class<T> exceptionType) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, T {
    final String message = "some message";
    throw exceptionType.getConstructor(String.class).newInstance(message);
}

或重新抛出RuntimeException中包含的已捕获异常。

答案 1 :(得分:0)

您可以在newInstance对象上使用Class方法。

答案 2 :(得分:0)

反射非常混乱。可接受的答案有效,但是您的代码将很难遵循。为了避免这种情况,最好重构代码。