反映:实例化并从字符串

时间:2015-10-20 12:21:01

标签: java reflection

我在Spring Batch项目中使用java Reflect来创建通用ItemProcessor。我目前仍然坚持如何从名为ItemProcessor的参数传递的类中抛出异常。

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

以下是代码示例,???是我遇到的地方:

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 Batch&#34; Skip Mechanics&#34;是基于例外&#39;类名。

1 个答案:

答案 0 :(得分:3)

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

// 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 }));