动态识别 Java 应用程序中的子类
Java 程序利用松散联合的 .class 文件。这使得在运行时动态识别扩展基类的所有子类变得具有挑战性。但是,有一种机制可以缓解此限制。
org.reflections 库
org.reflections 库为在运行时发现子类提供了强大的解决方案。它利用注释和反射来内省类及其关系。以下代码片段演示了其用法:
Reflections reflections = new Reflections("com.mycompany"); Set<Class<? extends MyInterface>> classes = reflections.getSubTypesOf(MyInterface.class);
其中“com.mycompany”是用于扫描类的包。此代码捕获指定包中 MyInterface 的所有子类型。
示例用法
例如,请考虑以下代码:
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()); } } }
此代码迭代 java.util 包中 List 的所有子类型。具体来说,它标识了 ArrayList 并演示了通过反射创建实例的能力。输出将包括以下内容:
java.util.LinkedList java.util.AbstractSequentialList java.util.Vector java.util.ArrayList: 1
以上是Java中如何在运行时动态查找基类的所有子类?的详细内容。更多信息请关注PHP中文网其他相关文章!