【无侵入】agent服务+javassist字节码操作

简介

转载出自:http://blog.csdn.net/supera_li/article/details/45846175 
对于agent,是在vm启动,执行方法前,将字节码修改的服务代理。 
对于javassist,是修改字节码具体实现。 
这两个结合有什么用啊?写测试框架,不仅局限于此。 
对于字节码: 
字节码处理工具,bcel,asm与虚拟机指令打交道。Javassist采用java编码的方法处理字节码,性能相对较低,但方便。 
官方:http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/ 
例子: 
创建class http://blog.csdn.net/sadfishsc/article/details/9999169 
拦截方法AOP http://yonglin4605.iteye.com/blog/1396494 
教程:http://www.ibm.com/developerworks/cn/java/j-dyn0916/ 
API: http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/html/index.html 
API文档:045Javassist入门手册

使用

与Agent结合的使用 
1.创建项目,引入jar包 
这里写图片描述

2.编写MANIFEST.MF文件 
内容: 
manifest-Version: 1.0 
Premain-Class: com.agent.PerfMonAgent //启动agent模式的实现类 
Can-Redefine-Classes: true 
3.编写PerfMonAgent类,即jvm启动agent模式后,执行方法之前调用的类 
这里写图片描述

4.编写PerfMonXformer类实现ClassFileTransformer接口的transform方法,即转化类格式的实现 
这里写图片描述

具体的methods就是字节码的具体处理,需要用到javassist包中的提供的方法来修改。 
5.将agent服务打包jar,使用自定义.MF文件 
1) 项目右键->Export->java->JAR file 
2) 选中项目

3) 选择jar的路径 
4) Next,Next 
5) 使用MF文件 
这里写图片描述 
6) Finish

6.项目配置,加入agent服务 
1) 项目右键,或者java文件右键->Run Configurations 
2) (x)=Arguments选项卡,填入启动VM参数 
这里写图片描述 
3) Run 
7.启动项目或者运行某一个java类,都会启动agent并修改字节码

下载

源码:http://download.csdn.net/detail/supermarss/8716783 
javassist学习手册:http://download.csdn.net/detail/supermarss/8716863

你可能感兴趣的:(Java)