2017-10-28 59 views
0

我有这个模型类有大量的字符串。我想在将它们发送到JSP之前对每个字符串进行清理。这里是我的代码:在运行时使用反射调用setter时的实例化异常

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方法调用行抛出一个实例异常。现在,我明白运行时对象类可能没有无参数构造函数。

有什么办法可以避免这种情况?构建一个无参数构造函数会有所帮助吗?

谢谢!

+0

为什么要构造一个新实例,然后调用setter?你不应该在原始对象上调用setter吗? – Kenster

+0

我的不好。我刚刚解决了它。这就是你的意思,对吧? setter.invoke(OBJ,sanitizeString(getter.invoke(OBJ))); –

+0

@kenster添加您的评论作为答案,以便我可以接受它。 –

回答

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

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

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