你能使用反射找到包中的所有类吗?

2022-08-31 04:14:00

是否可以在给定包中找到所有类或接口?(快速查看例如,似乎没有。


答案 1

由于类装入器的动态特性,这是不可能的。类装入器不需要告诉 VM 它可以提供哪些类,相反,它们只是传递类的请求,并且必须返回类或引发异常。

但是,如果您编写自己的类装入器,或者检查类路径及其 jar,则可以找到此信息。不过,这将通过文件系统操作进行,而不是反射。甚至可能有库可以帮助您执行此操作。

如果存在生成或远程传递的类,您将无法发现这些类。

通常的方法是在文件中注册您需要访问的类,或者在其他类中引用它们。或者只是在命名时使用约定。

附录:反射库将允许您在当前类路径中查找类。它可用于获取包中的所有类:

 Reflections reflections = new Reflections("my.project.prefix");

 Set<Class<? extends Object>> allClasses = 
     reflections.getSubTypesOf(Object.class);

答案 2

你应该看看开源的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);