2011-11-28 81 views
6

我想將對象的所有字符串成員都設置爲空字符串(如果它們爲空)。使用空字符串初始化所有字符串成員

僞代碼:

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

什麼是實現這一目標的最簡單方法是什麼? 我可以使用的任何框架/工具? 通過反思寫我自己的解決方案?

+1

爲了什麼目的?在相應的get()方法中執行此操作更容易,如果始終調用它,則會比影響實際值更容易。 – EJP

+0

這些類由JAXB2生成,所以我不想更改它們。 – Sebi

+0

如果您使用'.xsd'來爲JAXB2定義架構,則可以在'.xsd'中直接定義'default'值。 – ante

回答

5
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

您可以使用反射列出對象的所有字段,然後檢查並更改它。您可能必須修改訪問級別(如果它們是私密的)。您可以在搜索Google時查找很多教程,例如this one

0

另一種方法是編寫一個實用程序,該實用程序生成將空字符串設置爲特定對象成員的代碼。

0

贊成可重複使用的設計,你應該考慮使用空值的默認值,就像Apache的共同defaultString API,這樣的事情:

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

您也可以考慮使用defaultString(String str,String defaultStr),讓你有選擇如果有任何理由,將默認值更改爲任何值。

StringUtils的documentation

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; 
    } 
} 

這將是更快的運行時間,因爲這一方面會被編譯成字節碼,否則 反射將在運行 - 使用時間並減慢你的應用程序。