使用反射在运行时调用setter时的实例化异常

时间:2017-10-28 10:52:08

标签: java

我有这个拥有大量字符串的模型类。我想在将它们发送到JSP之前清理每个字符串。这是我的代码:

public static void sanitize(Object obj) {
    for (Field field : obj.getClass().getDeclaredFields()) {
        if (field.getType().isAssignableFrom(String.class)) {
            String name = Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
            Method getter;
            Method setter;
            try {
                getter = obj.getClass().getDeclaredMethod("get" + name);
                setter = obj.getClass().getDeclaredMethod("set" + name, field.getType());
                setter.invoke(obj.getClass().newInstance(),
                        sanitizeString(getter.invoke(obj.getClass().newInstance())));
                log.info("Done");
            } catch (Exception e) {
                log.error("{}", e);
            }
        }
    }
}

问题: setter调用行正在抛出一个Instantiation异常。现在,我知道运行时对象类可能没有no-args构造函数。

有什么方法可以避免这种情况吗?构建一个no-args构造函数会有帮助吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

setter.invoke(obj.getClass().newInstance(),
       sanitizeString(getter.invoke(obj.getClass().newInstance())));

您正在创建对象类的新实例,并在其上调用getter和setter。你的意图几乎肯定是在原始对象上调用getter和setter。为此,您应该将原始对象传递给invoke()

setter.invoke(obj, sanitizeString(getter.invoke(obj)));