使用空字符串初始化所有字符串成员

问题描述:

我想将对象的所有字符串成员都设置为空字符串(如果它们为空)。使用空字符串初始化所有字符串成员

伪代码:

foreach member in object { 
    if (member instanceof String and member == null) { 
     member = ''; 
    } 
} 

什么是实现这一目标的最简单方法是什么? 我可以使用的任何框架/工具? 通过反思写我自己的解决方案?

+1

为了什么目的?在相应的get()方法中执行此操作更容易,如果始终调用它,则会比影响实际值更容易。 – EJP

+0

这些类由JAXB2生成,所以我不想更改它们。 – Sebi

+0

如果您使用'.xsd'来为JAXB2定义架构,则可以在'.xsd'中直接定义'default'值。 – ante

public static void setEmpty(Object object) throws IllegalArgumentException, IllegalAccessException { 
    Class<?> clazz = object.getClass(); 
    Field[] fields = clazz.getDeclaredFields(); 
    for (Field field : fields) { 
     if (String.class.equals(field.getType())) { 
      field.setAccessible(true); 
      if (field.get(object) == null) { 
       field.set(object, ""); 
      } 
     } 
    } 
} 

您可以使用反射列出对象的所有字段,然后检查并更改它。您可能必须修改访问级别(如果它们是私密的)。您可以在搜索Google时查找很多教程,例如this one

另一种方法是编写一个实用程序,该实用程序生成将空字符串设置为特定对象成员的代码。

赞成可重复使用的设计,你应该考虑使用空值的默认值,就像Apache的共同defaultString API,这样的事情:

public String getValue(String value){ 
    return StringUtils.defaultString(value); 
} 

您也可以考虑使用defaultString(String str,String defaultStr),让你有选择如果有任何理由,将默认值更改为任何值。

StringUtils的documentation

尝试用AspectJ:

@Aspect 
public class StringHandler { 
    @Around("execution(String com....YourClass.*(*))") 
    public Object handle(ProceedingJoinPoint thisJoinPoint) throws Throwable { 
     String s = (String) thisJoinPoint.proceed(); 
     if (s == null){ 
      return ""; 
     } 
     return s; 
    } 
} 

这将是更快的运行时间,因为这一方面会被编译成字节码,否则 反射将在运行 - 使用时间并减慢你的应用程序。