java.lang.instrument.Instrumentation是监测运行在JVM程序的Java API,利用Instrumentation我们可以实现如下功能:

    1. 动态添加或移除自定义的ClassFileTransformeraddTransformer/removeTransformer),JVM会在类加载时调用Agent中注册的ClassFileTransformer
    2. 动态修改classpathappendToBootstrapClassLoaderSearchappendToSystemClassLoaderSearch),将Agent程序添加到BootstrapClassLoaderSystemClassLoaderSearch(对应的是ClassLoader类的getSystemClassLoader方法,默认是sun.misc.Launcher$AppClassLoader)中搜索;
    3. 动态获取所有JVM已加载的类(getAllLoadedClasses);
    4. 动态获取某个类加载器已实例化的所有类(getInitiatedClasses)。
    5. 重定义某个已加载的类的字节码(redefineClasses)。
    6. 动态设置JNI前缀(setNativeMethodPrefix),可以实现Hook native方法。
    7. 重新加载某个已经被JVM加载过的类字节码retransformClasses)。

    Instrumentation类方法如下:
    **2. Instrumentation - 图1