Mmc秒杀圈百科 

InstrumentationImpl:查看版本 v1

由 朝武芳乃 于 2026-10-04 01:17 保存 · 1452 字节
''本条基于 Java 17(Minecraft 1.20.1 所用版本)。'' '''InstrumentationImpl'''(<code>sun.instrument.InstrumentationImpl</code>,位于 <code>java.instrument</code> 模块)是 [[Instrumentation]] 接口在 JDK 中的内部实现。 == 结构 == * 保存一个指向本地 JPLIS agent 的指针(<code>long</code> 类型字段),<code>retransformClasses</code>、<code>redefineClasses</code> 等操作通过 native 方法交给 [[JVMTI]] 完成。 * 内部用两个 <code>TransformerManager</code> 分别管理普通的和可重转换的 <code>ClassFileTransformer</code>。 * 类加载或重转换时,JVM 回调它的 <code>transform</code> 方法,再依次调用已注册的转换器。 == 与 Agent 加载的关系 == JVM 加载 [[JavaAgent]] 时,由本地代码创建它的实例,再通过 <code>loadClassAndCallPremain</code> / <code>loadClassAndCallAgentmain</code> 调用 agent 的 <code>premain</code> / <code>agentmain</code>,把自己作为参数传进去。 == 非常规获取 == * <code>sun.instrument</code> 包不对外导出,直接访问需要 <code>--add-exports</code> / <code>--add-opens</code>,或借助 [[MethodHandle]] 的 <code>IMPL_LOOKUP</code>、[[Unsafe]] 绕过。 * 有人在不使用 <code>-javaagent</code> 的情况下,自行拿到 JPLIS agent 指针后调用它的私有构造器来构造实例。这种做法依赖 JDK 内部实现,构造器参数在不同版本间可能变化。

其他版本