簡體   English   中英

如何查找 Java 接口的所有實現,而不將它們全部實例化

[英]How to find all implementations of a Java interface, without instantiating them all

我在我的應用程序中為不同的“數據點”創建了一組接口。 我希望能夠以相當模塊化的方式添加或刪除“數據點”,並且只加載用戶需要的數據點。 目前我只有一個列表,我可以通過 ID 訪問我需要的列表。 我想用我添加 DataPointMethods 接口的實現時自動更新的東西替換它,這不需要我實例化我的所有類,無論我是否需要它們。 現在這不是一個大問題,但考慮到可擴展性,我知道它會是。

當前代碼:

private void setupMethodsList() {
    dataPointMethodsList = new ArrayList<DataPointMethods>();

    dataPointMethodsList.add(WorkoutMethods.getInstance());
    dataPointMethodsList.add(SleepMethods.getInstance());
    dataPointMethodsList.add(WalkingMethods.getInstance());
    dataPointMethodsList.add(FoodMethods.getInstance());
    dataPointMethodsList.add(WeightMethods.getInstance());
    dataPointMethodsList.add(WaterMethods.getInstance());
}

可以做一個如下所示的 switch 語句:

public DataPointMethods getDataPointMethod(int dataPointID){

    DataPointMethods dataPointMethods;

    switch (dataPointID) {
        case 0:
            dataPointMethods = FoodMethods.getInstance();
            break;
        case 1:
            dataPointMethods = WorkoutMethods.getInstance();
            break;
         // TODO: add more cases each time I add a DataPoint...
        default:
            dataPointMethods = WorkoutMethods.getInstance();
            Log.w(TAG, "invalid DataPointID passed");
            break;
        // How do I just make the method just stop if the ID is wrong though? If default runs it is 100% definitely an error...
    }

    return dataPointMethods;
}

雖然這可能是更好的性能明智的,但維護起來有點痛苦。

有沒有更理想的解決方案? 到目前為止,我發現的唯一解決方案涉及實例化所有內容,這違背了目的......

如果您想要一個低維護的解決方案,您可以使用ClassPathScanningCandidateComponentProvider來掃描您的類路徑以獲取實現您的接口的類的名稱。 然后您可以使用反射從那里開始。

    ClassPathScanningCandidateComponentProvider scanner =
            new ClassPathScanningCandidateComponentProvider(false);

    scanner.addIncludeFilter(new AssignableTypeFilter(DataPointMethods.class));

    for (BeanDefinition bd : scanner.findCandidateComponents("basepackage")) {
        Class<?> clazz = Class.forName(bd.getBeanClassName());
        DataPointMethodsmethod = (DataPointMethods)clazz.getMethod("getInstance").invoke(null);
    }

暫無
暫無

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

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