Java Reflection遍历嵌套对象并列出和更新字段

时间:2018-08-31 15:46:28

标签: java reflection

我有以下复杂的POJO类发票

public class Measure {

    private String id;
    private Float value;

    public String getId() { return id; }
    public void setId(String id) { this.id = id; }    

    public Float getValue() { return value; }
    public void setValue(Float value) { this.value = value; }

}

public class LineItem {

    private Integer lineNumber;      
    private Measure shipped;       
    private List<LineItem> lineItems;  


    public Integer getLineNumber() { return lineNumber; }
    public void setLineNumber(Integer lineNumber) { this.lineNumber = lineNumber; }

    public Measure getShipped() { return shipped; }
    public void setShipped(Measure shipped) { this.shipped = shipped; }

    public List<LineItem> getLineItems() { return lineItems; }
    public void setLineItems(List<LineItem> lineItems) { this.lineItems = lineItems; }

}

public class Invoice {


    private String originUid;
    private String vehicleUid;
    private List<LineItem> lineItems;

    public String getOriginUid() { return originUid; }
    public void setOriginUid(String originUid) { this.originUid = originUid; }

    public String getVehicleUid() { return vehicleUid; }
    public void setVehicleUid(String vehicleUid) { this.vehicleUid = vehicleUid; }

    public List<LineItem> getLineItems() { return lineItems; }
    public void setLineItems(List<LineItem> lineItems) { this.lineItems = lineItems; }


}

现在,我想遍历每个字段,包括Invoice对象中的嵌套对象,并使用Reflection更新它们。

我可以递归调用updateIncomingObject()。但是我需要知道如何从字段中取出嵌套对象,如注释部分所示。

public Object updateIncomingObject(Object incomingObject) {

    Field[] incoming =  incomingObject.getClass().getDeclaredFields(); 
    for (Field incomingField : incoming) {
        incomingField.setAccessible(true);
        if (incomingField.getType().isArray()) {
         // for (each occurrence in thisArray ???) {
         //     Object result = updateIncomingObject(occurrence);
         //     thisArray.set(index,result);
         // }
         // incomingField.set(incomingObject, thisArray);
        } 
        else if (!incomingField.getType().getName().startsWith("java.lang")) {
         // Object objInstance = incomingField.???; 
         // Object result = updateIncomingObject(objInstance);
         // incomingField.set(incomingObject, result);
        }
        else {
            if (incomingField.getType().equals(String.class) && incomingField.get(incomingObject) != null) {
                String trimmed = incomingField.get(incomingObject).toString().trim();
                incomingField.set(incomingObject, trimmed);
            }
        }
    }
    return incomingObject;
}

如何将字段转换为对象实例?

1 个答案:

答案 0 :(得分:1)

要访问 数组 的对象(用[]定义的字段),可以执行以下操作:

if (incomingField.getType().isArray()) {
   Object[] thisArray = (Object[]) incomingField.get(incomingObject);
   for (int k = 0; k < thisArray.length; k++) {
      Object occurrence = thisArray[k];
      Object result = updateIncomingObject(occurrence);
      thisArray[k] = result;
   }
   incomingField.set(incomingObject, thisArray);
} 

要访问 列表 的对象,您可以执行以下操作:

if (List.class.isAssignableFrom(incomingField.getType())) {
    List<?> thisList = (List<?>) incomingField.get(incomingObject);
    for (int k = 0; k < thisList.size(); k++) {
        Object occurrence = thisList.get(k);
        Object result = updateIncomingObject(occurrence);
        thisList.set(k, occurrence);
    }
}

注意:如果在迭代数组/列表时调用 updateIncomingObject ,并且数组/列表中的对象是数组(Object []),则您的方法将不会做任何事情,因为数组(Object [])类的声明字段数为0。

希望对您有帮助。