java.lang.instrument.Instrumentation
是监测运行在JVM
程序的Java API
,利用Instrumentation
我们可以实现如下功能:
- 动态添加或移除自定义的
ClassFileTransformer
(addTransformer/removeTransformer
),JVM会在类加载时调用Agent中注册的ClassFileTransformer
; - 动态修改
classpath
(appendToBootstrapClassLoaderSearch
、appendToSystemClassLoaderSearch
),将Agent程序添加到BootstrapClassLoader
和SystemClassLoaderSearch
(对应的是ClassLoader类的getSystemClassLoader方法
,默认是sun.misc.Launcher$AppClassLoader
)中搜索; - 动态获取所有
JVM
已加载的类(getAllLoadedClasses
); - 动态获取某个类加载器已实例化的所有类(
getInitiatedClasses
)。 - 重定义某个已加载的类的字节码(
redefineClasses
)。 - 动态设置
JNI
前缀(setNativeMethodPrefix
),可以实现Hook native方法。 - 重新加载某个已经被JVM加载过的类字节码
retransformClasses
)。
Instrumentation
类方法如下:
**