java指定agent的参数

javaAgent是从JDK1.5及以后引入的,在1.5之前无法使用,也可以叫做java代理。

1. 代理 (agent) 是在你的main方法前的一个拦截器 (interceptor),也就是在main方法执行之前,执行agent的代码。

agent的代码与你的main方法在同一个JVM中运行,并被同一个system classloader装载,被同一的安全策略 (security policy) 和上下文 (context) 所管理。

那么怎样写一个java agent? 在java5和java6中只需要实现premain这个方法:
[java]  view plain copy
  1. public static void premain(String agentArgs, Instrumentation inst)   
  2.   
  3. 例如:  
  4.   
  5. package seeeyou.monitor;  
  6.   
  7. import java.lang.instrument.Instrumentation;  
  8.   
  9. public class MyAgent {  
  10.     public static void premain(String agentOps, Instrumentation inst){  
  11.         System.out.println(agentOps);  
  12.     }  
  13. }  
  14.   
  15. 如果找不到上面的这种premain的定义,还会尝试调用下面的这种premain定义:  
  16. public static void premain(String agentArgs)  

2.写完这个代理类后,需要打成jar包,在jar包里面的 META-INF/MAINIFEST.MF 必须包含 Premain-Class这个属性。
如下:
[java]  view plain copy
  1. Manifest-Version: 1.0  
  2. Premain-Class: seeeyou.monitor.MyAgent  
  3. Can-Redefine-Classes: true  
需要注意的是,第四行是空行的,这一行必须有,否则绝对会报错。
目录结构基本如下图:


3.在一个java应用中,-javaagent这个参数的个数是不限的,你可以指定多个javaagent,所有的javaagent会按顺序执行,执行完各个agent之后,再执行main方法。比如
[java]  view plain copy
  1. set JAVA_OPTS=%JAVA_OPTS% -javaagent:D:/tools/myagent1.jar  -javaagent:D:/tools/myagent2.jar  -javaagent:D:/tools/myagent3.jar   
[java]  view plain copy
  1. 那么执行顺序就是:myagent1.premain  -> myagent2.premain -> myagent.premain  ->myprogram.main  

4.放在main方法之后的premain方法是不会被执行的。比如这个运行:
[java]  view plain copy
  1. jar -javaagent:D:/tools/myagent1.jar -jar myprogram.jar  -javaagent:D:/tools/myagent2.jar  -javaagent:D:/tools/myagent3.jar   
  2. 这个执行顺序就是:myagent1.premain  -> myprogram.main -> myagent2.premain  ->myagent3.premain  
5.每一个java agent 都可以接收一个字符串类型的参数,也就是premain中的agentArgs,这个agentArgs是通过java option中定义的。
如:java -javaagent:myagent.jar=thisIsAgentArgs -jar MyProgram.jar

myagent中premain接收到的agentArgs的值将是”thisIsAgentArgs” (不包括双引号)

6. 参数中的Instrumentation:通过参数中的Instrumentation inst,添加自己定义的ClassFileTransformer,来改变class文件。关于instrument,后面再介绍
7.通过java agent就可以不用修改原有的java程序代码,通过agent的形式来修改或者增强程序了,或者做热启动等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值