1. 代理 (agent) 是在你的main方法前的一个拦截器 (interceptor),也就是在main方法执行以前,执行agent的代码。java
agent的代码与你的main方法在同一个JVM中运行,并被同一个system classloader装载,被同一的安全策略 (security policy) 和上下文 (context) 所管理。安全
那么怎样写一个java agent? 在java5和java6中只须要实现premain这个方法:public static void premain(String agentArgs, Instrumentation inst) 例如: package seeeyou.monitor; import java.lang.instrument.Instrumentation; public class MyAgent { public static void premain(String agentOps, Instrumentation inst){ System.out.println(agentOps); } } 若是找不到上面的这种premain的定义,还会尝试调用下面的这种premain定义: public static void premain(String agentArgs)
Manifest-Version: 1.0 Premain-Class: seeeyou.monitor.MyAgent Can-Redefine-Classes: true须要注意的是,第四行是空行的,这一行必须有,不然绝对会报错。
set JAVA_OPTS=%JAVA_OPTS% -javaagent:D:/tools/myagent1.jar -javaagent:D:/tools/myagent2.jar -javaagent:D:/tools/myagent3.jar
那么执行顺序就是:myagent1.premain -> myagent2.premain -> myagent.premain ->myprogram.main
jar -javaagent:D:/tools/myagent1.jar -jar myprogram.jar -javaagent:D:/tools/myagent2.jar -javaagent:D:/tools/myagent3.jar 这个执行顺序就是:myagent1.premain -> myprogram.main -> myagent2.premain ->myagent3.premain
myagent中premain接收到的agentArgs的值将是”thisIsAgentArgs” (不包括双引号)this