2012-02-23 82 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()); 
     } 
    } 
    } 
}