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中文网其他相关文章!