Instrumentation:查看版本 v1
由 朝武芳乃 于 2026-10-04 01:17 保存 · 1565 字节
''本条基于 Java 17(Minecraft 1.20.1 所用版本)。''
'''Instrumentation'''(<code>java.lang.instrument.Instrumentation</code>)是 [[JavaAgent]] 修改类的标准接口,底层由 [[JVMTI]] 实现,JDK 中的具体实现类是 [[InstrumentationImpl]]。
== 获取 ==
* 启动时:<code>-javaagent:xxx.jar</code>,jar 清单声明 <code>Premain-Class</code>,JVM 调用 <code>premain(String, Instrumentation)</code>。
* 运行时附加:通过 Attach API(<code>VirtualMachine.attach(pid).loadAgent(jar)</code>),清单声明 <code>Agent-Class</code>,JVM 调用 <code>agentmain</code>。Java 9 起默认不允许附加到自身进程(需 <code>-Djdk.attach.allowAttachSelf=true</code>)。
* 重转换 / 重定义还需清单声明 <code>Can-Retransform-Classes</code> / <code>Can-Redefine-Classes</code>。
== 常用方法 ==
* <code>addTransformer(ClassFileTransformer, boolean)</code>:注册转换器,类加载或重转换时收到字节码
* <code>retransformClasses</code> / <code>redefineClasses</code>:修改已加载的类
* <code>getAllLoadedClasses</code>、<code>getObjectSize</code>
* <code>appendToBootstrapClassLoaderSearch</code>、<code>redefineModule</code>(可给模块加 opens)
== 特点与限制 ==
* 能修改已加载的类和 <code>java.*</code> 等 JDK 类,弥补了 [[Mixin]] 只能处理未加载的非 JDK 类的不足。
* 重转换 / 重定义只能改方法体,不能增删字段、方法,也不能改继承关系。
* 字节码一般配合 [[objectweb asm]] 或 [[javassist]] 修改。