[英]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.