共计 1704 个字符,预计需要花费 5 分钟才能阅读完成。
转载自 https://www.cnblogs.com/jhxxb/p/11570503.html
Java Instrument 能做什么?最大的作用?
使开发者能够构建一个独立于应用程序的代理程序 Agent,用来监控和帮助运行在 JVM 上的程序,更重要的是可能替换和批改某些类的定义;
最大的作用:能够实现一种虚拟机级别反对的 AOP 实现形式;
基于 JVMTI 代理程序。
JVMTI:一套代理程序机制,为 JVM 相干工具提供的本地编程接口汇合。
JVMTI 能够反对第三方工具程序以代理的形式连贯和拜访 JVM,并利用 JVMTI 提供的丰盛的编程接口,实现很多跟 JVM 相干的性能。
java.lang.instrument.ClassFileTransformer 是什么,有什么作用?
ClassFileTransformer 当中的 transform 办法能够对类定义进行操作批改;
在类字节码载入 JVM 前,JVM 会调用 ClassFileTransformer.transform 办法,从而实现对类定义进行操作批改,实现 AOP 性能;绝对于 JDK 动静代理、CGLIB 等 AOP 实现技术,不会生成新类,也不须要原类有接口;
两个外围 API:ClassFileTransformer、Instrumention?
ClassFileTransformer:定义了类加载前的预处理类;
Instrumentation:增强器
(1)add/removeTransformer:增加 / 删除 ClasFileTransformer;
(2)retransformerClasses:指定哪些类,在已加载的状况下,从新进行转换解决,即触发从新加载类定义;对于从新加载的类不能批改旧有的类申明,比方:不能减少属性、不能批改办法申明等;
(3)redefineClasses:指定哪些类,触发从新加载类定义,与下面不同的是不会从新进行转换解决,而是把处理结果 bytecode 间接给 JVM;
(4)getAllLoadedClasses:获取以后已加载的 Class 汇合;
(5)getInitiatedClasses:获取由某个特定 ClassLoader 加载的类定义;
(6)getObjectSize:取得一个对象占用的空间大小;
(7)appendToBootstrapClassLoaderSearch/appentToSystemClassLoaderSearch:减少 BootstrapClassLoader/SystemClassLoader 搜寻门路;
(8)isNativeMethodPrefixSupported/SetNativeMethodPrefix:判断 JVM 是否反对拦挡 Native Method;
Java Instrument 工作原理?
在 JVM 启动时,通过 JVM 参数 -javaagent,传入 agent jar,Instrument Agent 被加载;
在 Instrument Agent 初始化时,注册了 JVMTI 初始化函数 eventHandlerVMinit;
在 JVM 启动时,会调用初始化函数 eventHandlerVMinit,启动了 Instrument Agent,用 sun.instrument.instrumentationImpl 类里的办法 loadClassAndCallPremain 办法去初始化 Premain-Class 指定类的 premain 办法;
初始化函数 eventHandlerVMinit,注册了 class 解析的 ClassFileLoadHook 函数;
在解析 Class 之前,JVM 调用 JVMTI 的 ClassFileLoadHook 函数,钩子函数调用 sun.instrument.instrumentationImpl 类里的 transform 办法,通过 TransformerManager 的 transformer 办法最终调用咱们自定义的 Transformer 类的 transform 办法;
因为字节码在解析 Class 之前改的,间接应用批改后的字节码的数据流代替,最初进入 Class 解析,对整个 Class 解析无影响;
从新加载 Class 仍然从新走 5-6 步骤;