繁体   English   中英

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

[英]How do you throw an instance of an Exception class created through reflection?

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

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

你能做这个吗?

首先, 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 将抛出自己的各种异常。 你需要处理这些。

一个潜在的解决方案看起来像这样( 的javadocClass#getConstructorjavadoc中Constructor#newInstance

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的捕获异常。

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

反射相当混乱。 接受的答案有效,但您的代码将更难以遵循。 您最好重构代码以避免这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM