繁体   English   中英

使用模式获取Javassist的所有类

[英]Getting all classes with Javassist using a pattern

如何使用Javassist中的“com.stackoverflow。*”等模式获取所有类?

我发现只有2种方法:

1 /按姓名查找课程

CtClass ClassPool.getDefault().getCtClass("com.stackoverflow.user.name")

2 /查找具有全名的类列表:

CtClass[] ClassPool.getDefault().get(String [] arg0)

你可以使用一些库: https//github.com/ronmamo/reflections

我认为你不能只用JRE课程来做到这一点。

来自doc的示例:

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

Set<Class<? extends SomeType>> subTypes = 
           reflections.getSubTypesOf(SomeType.class);

Set<Class<?>> annotated = 
           reflections.getTypesAnnotatedWith(SomeAnnotation.class);

迈克尔拉法格的建议是最好的方法。 Reflections库使用了javassist 基本上,javassist提供了一种从类或jar文件中读取原始字节代码并从中提取类元数据而无需实际加载类的方法,其中Reflection提供了更丰富的API来定位(通过类路径规范)并过滤集合你正在寻找的课程。

您可以仅使用javassist自己做同样的事情,但是您将重新创建Reflections库的某些部分。 您可以查看Reflections的源代码以了解它是如何工作的,但一般来说,它看起来像这样:

  1. 找到要扫描的类路径。 这通常是一组带有类文件树或一组Jar文件的目录,但也可能包含更复杂的结构,如WAR或EAR(Reflections支持相当不错)。

  2. 添加类文件所在的文件系统的根目录,或者将JAR文件引用添加到ClassPool实例。

  3. 使用文件系统迭代或JarInputStream,遍历每个类文件或JarEntry。 您可以过滤掉与“com / stackoverflow / **。class”不匹配的任何文件或条目
  4. 对于剩下的,使用文件或条目的名称,驱动类名并从javassist类池加载它。
  5. 使用加载的CtClass应用任何进一步的搜索条件。
  6. 现在您有了类引用列表,释放了ClassPool以进行垃圾回收。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM