您可以使用反射找到包中的所有类吗?

新手上路,请多包涵

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

原文由 Jonik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 783
2 个回答

由于类加载器的动态特性,这是不可能的。类加载器不需要告诉虚拟机它可以提供哪些类,它们只是对类的请求,并且必须返回一个类或抛出一个异常。

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

如果有生成或远程交付的类,您将无法发现这些类。

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

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

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

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

原文由 Staale 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题