我怎样才能在java中迭代dto的所有成员?

时间:2013-08-04 20:24:30

标签: java

我有一个关于基本java的问题。我有一个类,它有很多bigdecimal成员。 我想通过循环迭代这个类的所有成员。有什么办法吗?

public class LargeDTO extends CoreDTO {
    private BigDecimal price1;
    private BigDecimal price2;
    private BigDecimal price3;
    private BigDecimal price4;
    private BigDecimal price5;
    private BigDecimal price6;
    ...
    // getter & setter
}

public class UseLoop{
    LargeDTO largeDTO = fillLatgeDTO();
    BigDecimal total = BigDecimal.Zero;
    // Is it possible ?
    for(each member of largeDTO){
         total = total.add(largeDTO.getCurrentMember()); // price1, price2...
    }
}

5 个答案:

答案 0 :(得分:3)

使用Class#getDeclaredFields

Field[] fields = LargeDTO.class.getDeclaredFields();

或者将当前设计更改为List<BigDecimal> prices而不是具有相同类型的6个字段。

public class LargeDTO extends CoreDTO {
    private List<BigDecimal> prices;

    public LargeDTO() {
        prices = new ArrayList<BigDecimal>();
    }

    //getter and setter for your prices
}

//in client class...
LargeDTO largeDTO = new LargeDTO();
//fill the data...
for(BigDecimal price : largeDTO.getPrices()) {
    //do what you want/need...
}

答案 1 :(得分:1)

您可以使用java反射:Class.getDeclaredFields()http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredFields%28%29)并检查生成的字段数组。

答案 2 :(得分:1)

将大小数存储在列表或地图中。或者使用反射,但这会使事情变得不必要地复杂化。

答案 3 :(得分:1)

作为Reflection API的替代方案,您可以查看 java.beans 包中的BeanInfo类或来自的BeanMapApache BeanUtils项目。

使用 BeanInfo

for (PropertyDescriptor propDesc :
             Introspector.getBeanInfo(LargeDTO.class).getProperyDescriptors()) {
     total = total.add((BigDecimal) propDesc.getReadMethod().invoke(largeDTO));
}

使用 BeanMap

for (Object price : new BeanMap(largeDTO).valueIterator()) {
     total = total.add((BigDecimal) price);
}

Java Doc链接到: IntrospectorPropertyDescriptor

答案 4 :(得分:0)

您可以考虑首先使用其他数据结构,也就是说,如果价格以某种方式相关,您可以将它们存储在数组中并迭代它。或者你可以尝试像

这样的东西
for (BigDecimal number:new BigDecimal[]{largeDto.getPrice1(), largeDto.getPrice2(), ...}} {...}