Skip to main content
该模块提供运行时字节码注入能力,可以在 JVM 运行时动态拦截 Java 方法调用,插入自定义逻辑或完全替换方法实现。这为运行时调试、热修复等场景提供了强大支持。
此功能需要 Java Agent 支持,启动 JVM 时需要添加 -javaagent 参数。详见前置要求

前置要求

1. 环境准备

使用该功能需要 inst-core 模块并手动注册 jvm 模块。
build.gradle.kts
Code

2. 启动 Java Agent

在 JVM 启动参数中添加:
或使用 Gradle 运行:

3. 导入模块

在 Fluxon 脚本中导入 fs:jvm 模块:

快速上手

拦截方法调用(before)

在方法执行前插入逻辑,不影响原方法执行:

替换方法实现(replace)

完全替换方法的原始实现:

API 详解

inject - 注入拦截器

签名jvm::inject(target, type, handler) -> String 注入一个方法拦截器,返回唯一的注入 ID。 参数 目标格式
JVM 方法描述符使用内部格式,例如 (Ljava/lang/String;I)Z 表示接受 Stringint 参数,返回 boolean。 常见类型映射:I=int, J=long, Z=boolean, Ljava/lang/String;=String, V=void。
注入类型
  • "before":在原方法执行前调用 handler,handler 返回值被忽略,原方法继续执行
  • "replace":完全替换原方法,handler 返回值作为方法返回值
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>
  • 注入点过多可能影响类加载性能

调试技巧

查看当前注入

清理所有注入

相关链接