Kiro 中反编译 JAR 包并分析字节码的流程指南
Kiro 中反编译 JAR 包并分析字节码的流程指南适用场景当你的项目依赖了内部库没有源码需要确认某个配置项/属性是否被该库使用、以及具体如何使用时可以通过以下流程进行字节码分析。前置准备1. 解压 JAR 包到工作区将目标依赖 JAR 包解压后添加为 Kiro 的工作区文件夹# 在项目外创建一个目录将 jar 解压到其中mkdird:\test\my-lib-1.0.0cdd:\test\my-lib-1.0.0 jar-xfpath/to/my-lib-1.0.0.jar然后在 Kiro 中将解压目录添加到工作区File → Add Folder to Workspace。然后就可询问kiro我已经把反编译解压后的jar添加到了工作区jsh-mgt-lib-rocket-3.0.0中验证下xxx2. 确认javap可用确保系统 PATH 中有 JDK 的javap命令。注博客https://blog.csdn.net/badao_liumang_qizhi分析流程第一步探索库的目录结构使用listDirectory查看包结构定位关键类文件listDirectory pathmy-lib-1.0.0 depth5重点关注META-INF/spring/— Spring Boot 自动配置注册**/properties/— 配置属性绑定类**/config/— 配置类第二步查看自动配置入口读取自动配置注册文件确认入口类readFile pathmy-lib-1.0.0/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports或旧版 Spring BootreadFile pathmy-lib-1.0.0/META-INF/spring.factories第三步查看类签名javap -p用javap -p查看类的所有字段和方法声明javap-pcom/example/lib/properties/MyProperties.class注意javap的 cwd 需设为解压后的根目录包含com/目录的那一级。路径使用/分隔。示例输出public class com.example.lib.properties.MyProperties { private java.lang.String endpoint; private java.lang.String instanceId; private java.lang.String groupId; public java.lang.String getInstanceId(); public void setInstanceId(java.lang.String); ... }第四步查看字节码实现javap -c -p当需要确认某个字段/方法在逻辑中是否被调用时使用-c输出字节码指令javap-c-pcom/example/lib/config/MyConfig.class第五步过滤关键调用由于字节码输出冗长用Select-StringWindows或grepLinux/Mac过滤关键方法调用Windows PowerShelljavap-c-pcom/example/lib/config/MyConfig.class2$null|Select-String-PatterngetInstanceId|INSTANCE_ID|PropertyKeyConst-Context 3,3Linux/Mac Bashjavap-c-pcom/example/lib/config/MyConfig.class2/dev/null|grep-EgetInstanceId|INSTANCE_ID|PropertyKeyConst-B3-A3第六步查看常量池确认字符串引用javap -c -p -verbose当需要确认具体的常量字符串如 Property Key 名称时使用-verbosejavap-c-p-verbosecom/example/lib/config/MyConfig.class2$null|Select-String-PatterngetInstanceId|put|setProperty-Context 2,5常量池会显示类似#40 String AccessKey #57 String NAMESRV_ADDR #201 String GROUP_ID通用示例验证配置属性是否被库使用场景项目application.yml中配置了mylib:client:connection-timeout:5000retry-count:3需要确认retry-count是否真的被库代码使用。操作步骤1. 解压 JAR添加工作区 2. 查看属性类结构 javap -p com/example/lib/properties/ClientProperties.class → 确认存在 private int retryCount 字段和 getRetryCount() 方法 3. 查看配置类结构 javap -p com/example/lib/config/AutoConfig.class → 找到可能使用该属性的方法如 createClient() 4. 搜索字节码中的调用 javap -c -p com/example/lib/config/AutoConfig.class | Select-String getRetryCount -Context 3,3 若有输出 → 属性被使用查看上下文确认用法 若无输出 → 属性在该类中未被使用继续搜索其他类 5. 若有多个类需要检查批量搜索 Get-ChildItem -Recurse -Filter *.class | ForEach-Object { $result javap -c -p $_.FullName 2$null | Select-String getRetryCount if ($result) { Write-Host $_.Name; $result } }常用 javap 参数速查参数用途-p显示所有成员含 private-c输出字节码指令-verbose输出常量池、注解等完整信息-s输出内部类型签名-l输出行号和局部变量表注意事项路径格式javap接受的是类文件的相对路径从包根目录开始使用/分隔cwd 设置命令的工作目录必须是包含顶层包目录如com/的那一级.class无法被 grep/ripgrep 搜索二进制文件不能用文本搜索工具直接扫描必须通过javap先转为文本字节码阅读技巧invokevirtual 调用实例方法invokestatic 调用静态方法getfield/putfield 读写实例字段ldc 加载常量字符串、数字等注释中的// Method和// String直接告诉你调用了什么