Java 中基於反射的類別發現
在Java 應用程式中,在執行時確定擴充基底類別的所有類別會帶來挑戰,因為.class 檔案擴散的本質。本文探討了克服此限制的各種方法。
使用 Java 反射和第三方函式庫
透過反射,可以遍歷應用程式的類別路徑來定位類別。像 org.reflections 這樣的函式庫為這項任務提供了方便的方法。例如:
Reflections reflections = new Reflections("com.mycompany"); Set<Class<? extends MyInterface>> classes = reflections.getSubTypesOf(MyInterface.class);
此程式碼會擷取指定套件中擴充 MyInterface 的所有類別。
範例應用程式
考慮一個需要以下功能的應用程式:建立擴充 Animal 的所有類別的物件。使用上述技術,我們可以實現這一點:
public static void main(String[] args) throws IllegalAccessException, InstantiationException { Reflections reflections = new Reflections("java.util"); Set<Class<? extends List>> classes = reflections.getSubTypesOf(java.util.List.class); for (Class<? extends List> aClass : classes) { System.out.println(aClass.getName()); if (aClass == ArrayList.class) { List list = aClass.newInstance(); list.add("test"); System.out.println(list.getClass().getName() + ": " + list.size()); } } }
此程式碼將列印所有 List 實作的名稱並建立 ArrayList 的實例來驗證其功能。
結論
雖然Java 由於其基於類的結構而存在固有的挑戰,但使用反射和庫(例如org.reflections 提供了運行時類發現的實用方法,使開發人員能夠擴展功能並根據繼承關係動態建立類別的實例。
以上是在 Java 中如何在運行時發現給定類別的所有子類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!