Java Reflection переходит во вложенный объект, перечисляет и обновляет поля - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующий сложный счет класса 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 голосов
/ 31 августа 2018

Для доступа к объектам массива (поля, определенные с помощью []) вы можете сделать следующее:

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.

Надеюсь, это вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...