你能使用反射找到包中的所有类吗?
2022-08-31 04:14:00
是否可以在给定包中找到所有类或接口?(快速查看例如包
,似乎没有。
由于类装入器的动态特性,这是不可能的。类装入器不需要告诉 VM 它可以提供哪些类,相反,它们只是传递类的请求,并且必须返回类或引发异常。
但是,如果您编写自己的类装入器,或者检查类路径及其 jar,则可以找到此信息。不过,这将通过文件系统操作进行,而不是反射。甚至可能有库可以帮助您执行此操作。
如果存在生成或远程传递的类,您将无法发现这些类。
通常的方法是在文件中注册您需要访问的类,或者在其他类中引用它们。或者只是在命名时使用约定。
附录:反射库将允许您在当前类路径中查找类。它可用于获取包中的所有类:
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends Object>> allClasses =
reflections.getSubTypesOf(Object.class);
你应该看看开源的Reflections库。有了它,您可以轻松实现自己想要的。
首先,设置反射索引(这有点混乱,因为默认情况下禁用所有类的搜索):
List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());
Reflections reflections = new Reflections(new ConfigurationBuilder()
.setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner())
.setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
.filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("org.your.package"))));
然后,您可以查询给定包中的所有对象:
Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);