推荐一个类扫描工具,这是早些年写的工具了,支持 Java和Kotlin。他具有以下特点
- 无需加载即可分析:该工具能够在不实际加载类的情况下对其进行分析,这使得即使某些Jar包依赖于其他未加载的Jar包,也能顺利完成类分析工作。这种特性对于解决(比如插件系统)依赖管理问题尤其有用,避免了因缺少依赖而导致的分析失败。
- 类扫描能力:无论是单个类文件还是整个Jar包,这款工具都能提供深度扫描功能,帮助您快速定位所需的类、接口或注解等元素。它适用于构建插件系统、模块化应用以及任何需要动态加载和分析类的场景。
引入依赖
<dependency>
<groupId>com.com.github.zimoyin</groupId>
<artifactId>ClassSeeker</artifactId>
<version>1.0.2</version>
</dependency>
扫描类
- 扫描当前项目/Jar中所有的类
List<String> list= ClassSeeker.findClassAll();
List<String> list1 = ClassSeeker.findClass(ClassSeeker.ClassALL);
- 扫描指定的Jar中的类
List<String> list= ClassSeeker.findClassAll("./test.jar");
List<String> list1 = ClassSeeker.findClass(ClassSeeker.ClassALL,"./test.jar");
- 过滤类
这里的 cls 是使用 ASM 分析类后,封装的一个类的描述类,他使用方式与 Class 类似
List<String> list1 = ClassSeeker.findClass(ClassSeeker.ClassALL, null, cls -> {
return cls.getName().equals("io.github.test.Main");
});
分析类
- 获取分析类
// 通过类的字节数组分析类
ClassVsFactory.getClassVS(byte[] bytes)
// 通过 Class
ClassVsFactory.getClassVS(Class<?> cls)
// 通过 类的全限定名 获取分析类。第二个参数是 jar 的路径。
// 如果没有第二个参数则在JVM已经加载类中搜索
ClassVsFactory.getClassVS(@NonNull String cls, String... paths)
- 使用方式与 Class 类似。这里测试一些获取类中的方法
ClassVs vs = ClassVsFactory.getClassVS("java.lang.String");
for (GeneralMethod method : vs.getMethods()) {
// 获取方法中定义的变量
method.getLocalVariable()
System.out.println(method);
}
- 将 ClassVs 转为 Class
ClassVs vs = ClassVsFactory.getClassVS("java.lang.String");
Class<?> aClass = vs.newInstance();
- 获取类的引用
ClassVs vs = ClassVsFactory.getClassVS("java.lang.String");
for (String reference : vs.getReferences()) {
// 获取类字节码,只在Jvm加载的类中搜索
//byte[] classBytes = ClassReaderUtil.readClassBytes(reference, null, true);
//ClassVs vs1 = ClassVsFactory.getClassVS(classBytes);
// 2
ClassVs vs1 = ClassVsFactory.getClassVS(reference);
}