Java Code Instrumentation如何获取?
public class JavaDynAgent {
private static Instrumentation instrumentation;
private static Object lockObject = new Object();
public JavaDynAgent() {
}
public static void agentmain(String args, Instrumentation inst) {
Object var2 = lockObject;
synchronized(lockObject) {
if(instrumentation == null) {
instrumentation = inst;
System.out.println("0->" + inst);
} else {
System.out.println("1->" + inst);
}
}
}
public static Instrumentation getInstrumentation() {
return instrumentation;
}
}
  实现原理是:
  1.绑定pid获得虚拟机对象,然后通过虚拟机加载代理jar包,这样调用到agentmain,获取得到Instrumentation
  2.基于Instrumentation接口可以实现JDK的代理机制,从而实现对类进行动态重新定义。
  注意:com.sun.tools.attach.VirtualMachine的jar包是 jdk下lib中的tools.jar,所以项目中要引用到这个jar包,而且因为涉及到底层虚拟机,windows和linux机器这个jar不同
  因此,整个流程是:
  1.项目中引用 jdk/lib/tools.jar,否则无法使用VirtualMachine类
  2.项目中引用 javaagent.jar ,它提供了agentmain接口
  3.代码实现动态增加JDK代理