是否可以找到给定包中的所有类或接口? (快速查看例如 Package
,似乎没有。)
原文由 Jonik 发布,翻译遵循 CC BY-SA 4.0 许可协议
是否可以找到给定包中的所有类或接口? (快速查看例如 Package
,似乎没有。)
原文由 Jonik 发布,翻译遵循 CC BY-SA 4.0 许可协议
您或许应该看看开放源代码的 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);
原文由 Aleksander Blomskøld 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
由于类加载器的动态特性,这是不可能的。类加载器不需要告诉虚拟机它可以提供哪些类,它们只是对类的请求,并且必须返回一个类或抛出一个异常。
但是,如果您编写自己的类加载器,或检查类路径及其 jar,则可以找到此信息。这将通过文件系统操作,而不是反射。甚至可能有一些库可以帮助您做到这一点。
如果有生成或远程交付的类,您将无法发现这些类。
正常的方法是在某处注册您需要在文件中访问的类,或在不同的类中引用它们。或者只是在命名时使用约定。
附录: 反射库 将允许您在当前类路径中查找类。它可用于获取包中的所有类: