Bootstrap

类扫描工具 ClassSeeker

推荐一个类扫描工具,这是早些年写的工具了,支持 Java和Kotlin。他具有以下特点

  • 无需加载即可分析:该工具能够在不实际加载类的情况下对其进行分析,这使得即使某些Jar包依赖于其他未加载的Jar包,也能顺利完成类分析工作。这种特性对于解决(比如插件系统)依赖管理问题尤其有用,避免了因缺少依赖而导致的分析失败。
  • 类扫描能力:无论是单个类文件还是整个Jar包,这款工具都能提供深度扫描功能,帮助您快速定位所需的类、接口或注解等元素。它适用于构建插件系统、模块化应用以及任何需要动态加载和分析类的场景。

引入依赖

<dependency>
    <groupId>com.com.github.zimoyin</groupId>
    <artifactId>ClassSeeker</artifactId>
    <version>1.0.2</version>
</dependency>

扫描类

  1. 扫描当前项目/Jar中所有的类
List<String> list=   ClassSeeker.findClassAll();
List<String> list1 = ClassSeeker.findClass(ClassSeeker.ClassALL);

  1. 扫描指定的Jar中的类
List<String> list=   ClassSeeker.findClassAll("./test.jar");
List<String> list1 = ClassSeeker.findClass(ClassSeeker.ClassALL,"./test.jar");
  1. 过滤类
    这里的 cls 是使用 ASM 分析类后,封装的一个类的描述类,他使用方式与 Class 类似
List<String> list1 = ClassSeeker.findClass(ClassSeeker.ClassALL, null, cls -> {
    return cls.getName().equals("io.github.test.Main");
});

分析类

  1. 获取分析类
// 通过类的字节数组分析类
ClassVsFactory.getClassVS(byte[] bytes)
// 通过 Class
ClassVsFactory.getClassVS(Class<?> cls) 
// 通过 类的全限定名 获取分析类。第二个参数是 jar 的路径。
// 如果没有第二个参数则在JVM已经加载类中搜索
ClassVsFactory.getClassVS(@NonNull String cls, String... paths)
  1. 使用方式与 Class 类似。这里测试一些获取类中的方法
ClassVs vs = ClassVsFactory.getClassVS("java.lang.String");
for (GeneralMethod method : vs.getMethods()) {
    // 获取方法中定义的变量
	method.getLocalVariable()
    System.out.println(method);
}
  1. 将 ClassVs 转为 Class
ClassVs vs = ClassVsFactory.getClassVS("java.lang.String");
Class<?> aClass = vs.newInstance();
  1. 获取类的引用
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);
}
;