我想將對象的所有字符串成員都設置爲空字符串(如果它們爲空)。使用空字符串初始化所有字符串成員
僞代碼:
foreach member in object {
if (member instanceof String and member == null) {
member = '';
}
}
什麼是實現這一目標的最簡單方法是什麼? 我可以使用的任何框架/工具? 通過反思寫我自己的解決方案?
我想將對象的所有字符串成員都設置爲空字符串(如果它們爲空)。使用空字符串初始化所有字符串成員
僞代碼:
foreach member in object {
if (member instanceof String and member == null) {
member = '';
}
}
什麼是實現這一目標的最簡單方法是什麼? 我可以使用的任何框架/工具? 通過反思寫我自己的解決方案?
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;
}
}
這將是更快的運行時間,因爲這一方面會被編譯成字節碼,否則 反射將在運行 - 使用時間並減慢你的應用程序。
爲了什麼目的?在相應的get()方法中執行此操作更容易,如果始終調用它,則會比影響實際值更容易。 – EJP
這些類由JAXB2生成,所以我不想更改它們。 – Sebi
如果您使用'.xsd'來爲JAXB2定義架構,則可以在'.xsd'中直接定義'default'值。 – ante