此功能需要 Java Agent 支持,启动 JVM 时需要添加
-javaagent 参数。详见前置要求。前置要求
1. 环境准备
使用该功能需要inst-core 模块并手动注册 jvm 模块。
build.gradle.kts
Code
2. 启动 Java Agent
在 JVM 启动参数中添加:3. 导入模块
在 Fluxon 脚本中导入fs:jvm 模块:
快速上手
拦截方法调用(before)
在方法执行前插入逻辑,不影响原方法执行:替换方法实现(replace)
完全替换方法的原始实现:API 详解
inject - 注入拦截器
签名:jvm::inject(target, type, handler) -> String
注入一个方法拦截器,返回唯一的注入 ID。
参数:
目标格式:
JVM 方法描述符使用内部格式,例如
(Ljava/lang/String;I)Z 表示接受 String 和 int 参数,返回 boolean。
常见类型映射:I=int, J=long, Z=boolean, Ljava/lang/String;=String, V=void。"before":在原方法执行前调用 handler,handler 返回值被忽略,原方法继续执行"replace":完全替换原方法,handler 返回值作为方法返回值
- 第一个参数
self:- 实例方法:接收
this对象 - 静态方法:接收
null
- 实例方法:接收
- 后续参数:方法的实际参数,按顺序传递
restore - 撤销注入
签名:jvm::restore(idOrTarget) -> Boolean
撤销一个或多个注入,返回是否成功。
参数:
- 传入注入 ID:撤销指定的单个注入
- 传入目标字符串(包含
::):撤销该方法的所有注入
injections - 列出所有注入
签名:jvm::injections() -> List<Map>
返回当前所有活跃的注入信息。
返回值:每个 Map 包含以下字段:
示例:
实战场景
调试与日志
在不修改源码的情况下记录方法调用:热修复
运行时修复生产环境 bug:条件拦截
只在特定条件下拦截:注意事项
类加载时机
- 已加载的类:注入会触发
retransformClasses立即生效 - 未加载的类:注入会在类首次加载时自动应用
方法签名
使用带描述符的目标格式可以精确匹配重载方法:限制
- 不支持注入 JVM 核心类(如
java.lang.Object)的 native 方法 - 不支持注入构造函数(
<init>和<clinit>) - 注入点过多可能影响类加载性能