为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以使用反射找到包中的所有类?

是否可以使用反射找到包中的所有类?

侃侃尔雅 2019-06-01 13:25:44
是否可以使用反射找到包中的所有类?是否有可能在给定的包中找到所有的类或接口?(快速查看。Package,这似乎是不可能的。)
查看完整描述

4 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

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

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

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

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

增编:反思图书馆将允许您在当前类路径中查找类。它可以用于获取包中的所有类:

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

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


查看完整回答
反对 回复 2019-06-01
?
长风秋雁

TA贡献1757条经验 获得超7个赞

您可能应该看看开放源码。反射库..有了它,你可以很容易地实现你想要的。

首先,设置反射索引(因为默认情况下禁用了对所有类的搜索,这有点麻烦):

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


查看完整回答
反对 回复 2019-06-01
?
开满天机

TA贡献1786条经验 获得超13个赞

GoogleGuava 14包括一个新的类ClassPath使用三种方法扫描顶级类:

  • getTopLevelClasses()

  • getTopLevelClasses(String packageName)

  • getTopLevelClassesRecursive(String packageName)

ClassPathjavadocs想了解更多信息。


查看完整回答
反对 回复 2019-06-01
  • 4 回答
  • 0 关注
  • 803 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信