你可以使用反射来查找包中的所有类吗?

是否有可能找到给定包中的所有类或接口? (快速查看例如Package ,看起来不是。)


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

但是,如果您编写自己的类加载器,或者检查类路径和它的jar,可以找到这些信息。 这将通过文件系统操作,但不是反射。 甚至可能有图书馆可以帮助你做到这一点。

如果有一些类生成或远程传递,你将无法发现这些类。

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

附录:Reflections Library允许您在当前类路径中查找类。 它可以用来获取包中的所有类:

 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);

Google Guava 14包含一个新的ClassPath有三种扫描顶级类的方法:

  • getTopLevelClasses()
  • getTopLevelClasses(String packageName)
  • getTopLevelClassesRecursive(String packageName)
  • 请参阅ClassPath javadoc以获取更多信息。

    链接地址: http://www.djcxy.com/p/84171.html

    上一篇: Can you find all classes in a package using reflection?

    下一篇: javax vs java package