在一个java应用中,-javaagent这个参数的个数是不限的,你可以指定多个javaagent,所有的javaagent会按顺序执行,执行完各个agent之后,再执行main方法,放在main方法之后的premain方法是不会被执行的。比如set JAVA_OPTS=%JAVA_OPTS% -javaagent:D:/tools/myagent1.jar -javaagent:D:/tools/myagent2.jar -javaagent:D:/tools/myagent3.jar Test执行顺序就是:myagent1.premain -> myagent2.premain -> myagent.premain ->Test.main
javaagent
-javaagent:<jarpath>[=<options>]load Java programming language agent, see java.lang.instrument代理 (agent) 是在你的main方法前的一个拦截器 (interceptor),也就是在main方法执行之前,执行agent的代码。agent的代码与你的main方法在同一个JVM中运行,并被同一个system classloader装载,被同一的安全策略 (security policy) 和上下文 (context) 所管理。例如:java -javaagent:myagent.jar=mode=test Test 指定我们编写的 agent 的 jar 路径(./myagent.jar),以及要传给 agent 的参数(mode=test),在启动的时候这个 agent 就可以做一些我们希望的事:可以在加载 class 文件之前做拦截,对字节码做修改可以在运行期对已加载类的字节码做变更获取所有已经加载过的类获取所有已经初始化过的类(执行过 clinit 方法,是上面的一个子集)获取某个对象的大小将某个 jar 加入到 bootstrap classpath 里作为高优先级被 bootstrapClassloader 加载将某个 jar 加入到 classpath 里供 AppClassloard 去加载设置某些 native 方法的前缀,主要在查找 native 方法的时候做规则匹配。
在一个java应用中,-javaagent这个参数的个数是不限的,你可以指定多个javaagent,所有的javaagent会按顺序执行,执行完各个agent之后,再执行main方法,放在main方法之后的premain方法是不会被执行的。比如set JAVA_OPTS=%JAVA_OPTS% -javaagent:D:/tools/myagent1.jar -javaagent:D:/tools/myagent2.jar -javaagent:D:/tools/myagent3.jar Test执行顺序就是:myagent1.premain -> myagent2.premain -> myagent.premain ->Test.main
在一个java应用中,-javaagent这个参数的个数是不限的,你可以指定多个javaagent,所有的javaagent会按顺序执行,执行完各个agent之后,再执行main方法,放在main方法之后的premain方法是不会被执行的。比如set JAVA_OPTS=%JAVA_OPTS% -javaagent:D:/tools/myagent1.jar -javaagent:D:/tools/myagent2.jar -javaagent:D:/tools/myagent3.jar Test执行顺序就是:myagent1.premain -> myagent2.premain -> myagent.premain ->Test.main