簡體   English   中英

在Java中動態訪問和確定元素及其對象類型(不是數組/列表)

[英]Accessing & determining elements & its type of an object (not array/list) dynamically in java

我常見的主要領域模型是扁平化的,並且沒有一種對象的列表/數組。

在處理過程中,我需要放入某種提取邏輯-將所有相同類型的元素合並到主模型的某些臨時對象/模型的列表/數組中。 由於主模型正在增長,因此我不想使用getter方法調用和check實例手動檢查每個元素類型,因此,每當添加現有類型的新元素時,都需要在提取邏輯中為新添加的節點更新代碼。

示例-主模型-

Class MainModel{
 Customer buyer;
 Customer coBuyer;
 Money price;
 ....
}


//Extraction logic in some code which have a populated MainModel object from some service call 
// create a list of <Customer>  Type 
List<Customer> custList = new ArrayList<Customer>();
// populate it without calling getBuyer() and checking its type,

任何想法 ?

您可以創建一個接口並將其放在相同的列表中,而不會出現類型問題,然后在接口中放入方法getBuyer()

public Class MainModel implements HasBuyer{
 Customer buyer;
 Customer coBuyer;
 Money price;
 ....
}

public class Customer implements HasBuyer{ ... }

public interface HasBuyer{

 public Customer hasBuyer();

}

之后,您可以執行以下操作:

List<HasBuyer> custList = new ArrayList<HasBuyer>();

聽起來您需要一些反射性代碼。 有一些庫也可以幫助解決此類問題,但是可以執行以下操作的簡單方法如下。

public class ReflectiveGrabber {
    public static <T> List<T> grabMembers(Class<T> clas, Object object) {
        List<T> list = new ArrayList<>();
        try {
            for (Field field : object.getClass().getDeclaredFields()) {
                if (clas.equals(field.getType())) {
                    field.setAccessible(true);
                    T value = (T) field.get(object);
                    if (value != null) {
                        list.add(value);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    public static void main(String... none) throws Exception {
        System.out.println(grabMembers(String.class, new MainModel("foo", "bah", 10)));
        System.out.println(grabMembers(Integer.class, new MainModel("foo", "bah", 10)));
    }
}

class MainModel {
    MainModel(String buyer, String coBuyer, Integer money) {
        this.buyer = buyer;
        this.coBuyer = coBuyer;
        this.money = money;
    }

    String buyer;
    String coBuyer;
    Integer money;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM