2012-02-08 55 views
2

我可以編寫一個通用方法來修剪複雜對象(包含其他對象的對象)中的所有字符串嗎?應該用java反射api來實現這個嗎?謝謝。修剪複雜對象中的所有字符串元素

我在下面提供了一個示例。但實際上,對象內可能有多個對象。每個對象可能包含一個String的集合或者可能包含String的其他對象的集合。有沒有一種方法來修剪字符串 - 直接使用對象和集合中的對象。

public class School{ 
    private List<Course> courses; 
    private List<Student> students;  
    // Getters and Setters 
} 

public class Course{ 
    private String name; 
    private String xxx; 
    private String yyy; 
    private List<String> zzzList; 
} 

public class Student{ 
    private Map<String,String> xxx; 
    private List<Course> courseList; 
} 
+0

問題太模糊。當然可以,是的。應該如何完成取決於對象結構。 – simon 2012-02-08 07:58:00

回答

6

是,反射的方式。基本上,你需要:

  • 獲取類頂級對象(有[對象] .getClass())

  • 獲取對象的所有字段(clazz.getFields() - 請注意,它只適用於公共字段)

  • 檢查字段是否爲字符串(或者獲取field.getType()並檢查它是一個字符串還是做一個field.get(對象)和一個instanceof String)

  • 如果是這樣的話,更換stri NG與修整一個對象,使用field.set([你的對象],[修剪字符串])

  • 如果該字段是一個對象,但不是字符串,打電話給你的方法遞歸

這將做到這一點。

----剛剛看到您的更新中收集

修剪字符串會更加棘手,因爲字符串不公開爲集合(例如列表)的公共領域。

您將需要更聰明的東西,它將檢查一個對象是List,Map還是等等...(或派生類!)的實例。 主要的問題是,Java泛型在編譯類型中使用擦除類型完成。所以你不知道你的字段是List [String]或者List [Integer]或者其他什麼。每個列表[?]變成列表。

你仍然可以嘗試做這樣的:

  • 如果字段類型列表
  • 迭代通過列表值
  • 如果值的instanceof字符串,你必須從刪除列表並插入修剪後的版本
  • 如果值是一個對象,那麼您可以再次遞歸地使用您的方法。

並不是真實的生活樣本中非常有趣的,但更多的在庫邊,也許。 雖然很長的路要走!

+0

非常感謝huelbois!我可能還會使用其他很多集合。很長的路要走,如你所說! – 2012-02-08 08:37:31

+0

不要忘記接受你的問題的最佳答案...;) – huelbois 2012-02-08 09:32:28

2

是的,你可以很容易地用反射來做到這一點。只要檢查該字段是否爲instanceof String

確切的做法取決於您的對象結構。

+0

嗨 - 更新我的原始文章中的示例對象結構。 – 2012-02-08 08:15:11

-1
if (yourObject instanceof String){ 
    yourObject = yourObject.trim(); 
} 

希望它能幫助:)

1
/********************************************************************************************* 
* Trim first level children of string type in this object 
* @param obj which all string properties to be trimmed 
*********************************************************************************************/ 
public static void trimAll(final Object obj) 
throws LocalException 
{ 
    if (obj==null) return; 

    final Class c   = obj.getClass(); 
    final Method[] methods  = c.getMethods(); 
    final Class[] SETTER_ARGS = new Class[]{String.class}; 
    final Object[] SETTER_VAL = new Object[1]; 
    final String SET   = "set"; 
    final String GET   = "get"; 
    final String SPACE  = "\u0020"; 
    final String TAB   = "\t"; 

    for (final Method m:methods) 
    { 
     try 
     { 
      final String name=m.getName(); 
      if (
       name.length()>GET.length() 
      && name.indexOf(GET)==0 
      && m.getReturnType().equals(String.class) 
      && m.getParameterTypes().length==0) 
      { 
       final String v = (String)m.invoke(obj); 
       if (v!=null && (v.contains(SPACE) || v.contains(TAB))) 
       { 
        final Method setter=c.getMethod(SET+name.substring(3),SETTER_ARGS); 
        if (setter!=null) 
        { 
         SETTER_VAL[0]=v.trim(); 
         setter.invoke(obj,SETTER_VAL); 
        } 
       } 
      } 
     } 
     catch (final Throwable e) 
     { 
      throw new LocalException(LocalException.EC_GENERAL_EXCEPTION,e); 
     } 
    } 
}