我想将对象的所有String成员设置为空字符串,如果它们为null。
伪代码:
foreach member in object {
if (member instanceof String and member == null) {
member = '';
}
}
实现这一目标的最简单方法是什么? 我可以使用的任何框架/工具? 通过反思写出我自己的解决方案?
答案 0 :(得分:6)
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, "");
}
}
}
}
答案 1 :(得分:1)
您可以使用反射列出对象的所有字段,然后检查并更改它。如果它们是私有的,您可能必须修改访问级别。在搜索Google时,您可以找到很多关于此的教程,例如: this one
答案 2 :(得分:1)
尝试使用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;
}
}
这在运行时会更快,因为这个方面将被编译为字节码, 否则将在运行时使用反射并减慢您的应用程序。
答案 3 :(得分:0)
另一种方法是编写一个实用程序,该实用程序生成将空字符串设置为特定对象成员的代码。
答案 4 :(得分:0)
支持可重用设计,您应该考虑使用默认值作为空值,就像Apache的常见defaultString API一样,如下所示:
public String getValue(String value){
return StringUtils.defaultString(value);
}
您还可以考虑使用defaultString(String str,String defaultStr)
,以便在有任何理由时可以选择将默认值更改为任何内容。
StringUtils documentation