Instrumentation包的简介
JDK从1.5开始,在rt.jar包下有了java.lang.instrument这个文件夹,刚开始只支持agent方式启动,但使用还是不太方便,因为我们在JDK1.6后增加了attach方式。在官方文档提供了两种方式
agent命令方式
在jvm启动参数中增加
-javaagent:jarpath[=options]
agent有两点要求:
- agent jar必须包含Premain-Class属性,值是agent class启动类
- 必须实现 一个 public static premain的方法
- JDK加载这个方法使用系统类加载器( ClassLoader.getSystemClassLoader),这个premain方法在同样的security和 classloader 规则下,也就是说应用程序能做的事情,这里都可以做,如创建线程等(这里意味着agent与运行程序共享同一个jvm)。
public static void premain(String agentArgs, Instrumentation inst);
public static void premain(String agentArgs);
这里注意JVM默认会先调用上面那个参数全的方法,没有实现该方法才会调用下面那个简略版方法
运行过程中attach方式
- agent JAR必须包含Agent-Class属性,值是agent class的启动类。
- 必须实现 public static agentmain 方法
- 系统类加载器(ClassLoader.getSystemClassLoader)必须支持加载agent jar到系统class路径下(可以设置参数关闭)
public static void agentmain(String agentArgs, Instrumentation inst);
public static void agentmain(String agentArgs);
同上面agent方式,也会优先调用参数全的那个方法