反射:实例化并从字符串中的classname抛出异常



我在我的Spring Batch项目中使用java Reflect来创建一个通用的ItemProcessor。我目前卡住了如何抛出一个异常从一个类的名字被传递作为这个ItemProcessor的参数。

在下面的代码中,我设法从String形参中获得实际的类,然后获得所需的构造函数(带1个参数)。但是,当我想实例化(作为参数传递的类的)实际异常,然后抛出它时,我不知道如何声明这个异常的容器。

以下是代码的示例,???是我卡住的地方:

String exceptionClass; // With getter/setter
String exceptionText;  // With getter/setter
Class<?> clazz;
Constructor<?> constructor;
try {
    // Get the Exception class
    clazz = Class.forName(exceptionClass);
    // Get the constructor of the Exception class with a String as a parameter
    constructor = clazz.getConstructor(String.class);
    // Instantiate the exception from the constructor, with parameters
    ??? exception = clazz.cast(constructor.newInstance(new Object[] { exceptionText }));
    // Throw this exception
    throw exception;
} finally {
}

编辑

我可能需要添加的一件事是,我需要异常与作为参数传递的确切类一起抛出,因为Spring批处理"跳过机制"是基于异常的类名。

通过显式指定Class对象扩展Exception,我找到了一个可行的解决方案。然后我可以抛出它,而不需要声明这个类的新对象。

// Get class of the exception (with explicit "extends Exception")
Class<? extends Exception>clazz = (Class<? extends Exception>) Class.forName(exceptionClass);
// Get the constructor of the Exception class with a String as a parameter
Constructor<?> constructor = clazz.getConstructor(String.class);
// Instantiate and throw immediatly the new Exception
throw clazz.cast(constructor.newInstance(new Object[] { exceptionText }));

相关内容

  • 没有找到相关文章

最新更新