使用模式获取Javassist的所有类

时间:2015-06-12 08:07:37

标签: java javassist

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

我发现只有两种方法:

1 /按姓名查找课程

@MyAnnotation

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用以下库: 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);

答案 1 :(得分:3)

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

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

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

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

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