2012-02-23 123 views
2
private static Void createTbody(List object) { 

    Iterator hritr = object.iterator(); 
     while(hritr.hasNext()) { 

     UserDto users = (UserDto)hritr.next(); 
     users.userId; 
     users.userName; 
    } 
} 

DtoClass ::Java反射列表迭代

UserDto

public class UserDto { 

    public String userName; 
    public String userId; 

} 

在上面的代碼我沒有任何問題......

把我createTbody功能我不知道UserDto編譯時的類...它應該是動態類。這個類名我會通過反射。

UserDto users = (UserDto)hritr.next(); 

爲什麼?因爲是,private static Void createTbody(List object)對象可能包含的CustomerDto名單,UserDto等等

+0

你在問什麼? – javamonkey79 2012-02-23 06:53:40

+0

你不能做instanceof來檢查類型嗎? – 2012-02-23 07:03:08

+0

如果您在編譯時不知道該類,那麼在獲取它之後如何處理該條目?你不會知道它有'userName'和'userId'字段... – 2012-02-23 07:08:34

回答

2

首先,請扔掉你的迭代器。通過列表迭代不如做到 與現代語法:

for(Object iterm: listOfObjects) {} 

如果您有沒有問題這麼多clases,您可以檢查類對象與getClass().equals(someClassInQuestion)object instanceof SomeClass

如果你有太多的課,只是堅持回反射:

object.getClass().getMethod("getFoo",null).invoke(oject); 

(代碼簡化,你wuill需要一些護衛agains空值)

2

如果所有的DTO有共同的字段(如ID和姓名),你只需要訪問那些在你的方法,你可以使用所有的DTO接口:

interface SuperDTO { 
    public Long getId; 
    public String getName; 
    public void setId(Long id); 
    public void setName(String name); 
} 

所有的DTO的有擴展接口:public class UserDTO extends SuperDTO{}

所以,你可以重複你的列表是這樣的:

for(SuperDTO dto : someListWithDTOs){ 
    dto.setName("foobar"); 
    .... 
} 

編輯補充:

如果您的列表包含不同類型的DTO的,你可以使用instanceof

for(Object item : list){ 
    if(item instanceof UserDTO){ 
    ... 
    else if (item instanceof SomeDTO){ 
    ... 
    } 
} 
+0

我Dto不會有共同fields.it將有不同的領域。有什麼辦法可以做到這一點? – Jaypee 2012-02-23 09:45:49

+0

在這種情況下,您可以使用Konstantin Pribluda的方法。但是如果你的DTO有許多不同的領域,你的代碼將變得難以閱讀,容易出錯並且會使用更多的內存。 (反射是相當資源密集的)。假設每個列表只包含一種類型的DTO,我建議分別遍歷每個列表。否則,請參閱我編輯的帖子。 – steffinchen 2012-02-23 10:12:46

2

posElement是你的對象。

Field[] fields = posElement.getClass().getDeclaredFields(); 
for (Field field : fields) { 
    Type type = field.getGenericType(); 
    if (type instanceof ParameterizedType) { 
    ParameterizedType pt = (ParameterizedType) type; 

    if (PropertyUtils.getProperty(posElement, field.getName()) != null) { 
     for (int i = 0; i < pt.getActualTypeArguments().length; i++) { 
      Object obj = PropertyUtils.getIndexedProperty(posElement, field.getName(), i); 
      System.out.println(obj.getClass()); 
     } 
    } 
    } 
}