javassist 初步学习
来源:互联网 发布:天界五行进化数据 编辑:程序博客网 时间:2024/06/14 05:47
javassist简介
javassist可以对一个已经编译好了的.class文件的字节码进行改动,比如说我可以为一个类添加一个方法,添加一个属性,也可以修改一个方法等,还可以对一个方法,异常进行拦截等。
我们常用到的动态特性主要是反射,在运行时查找对象属性、方法,修改作用域,通过方法名称调用方法等。但反射的性能开销较大,Javassit是一个东京研究院开发的第三方库,提供了运行时操作Java字节码的方法。类似字节码操作方法还有ASM,几种动态编程方法相比较,在性能上Javassist高于反射,但低于ASM。
学习javassit,主要是为学习如何让已经运行中的虚拟机动态加载类做铺垫。
例子
maven 依赖
<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.20.0-GA</version></dependency>
java类
Screen类
package demo7;/** * Created by enyilr on 15/10/14. */public class Screen { public void plus(int i, int j) { int m = i + j; System.out.println("i plus j=" + m); }}
TransClass类
package demo5;/** * Created by enyilr on 15/10/14. */public class TransClass { public int getNumber() { return 2; }}
测试类Test
public class Test { public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException { ClassPool pool = ClassPool.getDefault(); CtClass transClass = pool.get("demo5.TransClass"); CtMethod ctm = transClass.getDeclaredMethod("getNumber"); ctm.insertAfter("System.out.println(\"add down!\");"); transClass.writeFile(); Method m = transClass.toClass().getMethod("getNumber"); TransClass transClass1 = TransClass.class.newInstance(); Object invoke = m.invoke(transClass1); System.out.println(invoke); pool.importPackage("java.util.Date"); CtClass screen = pool.get("demo7.Screen"); CtMethod plus = screen.getDeclaredMethod("plus"); plus.insertBefore("{System.out.println(\"i=\"+($1)+\",j=\"+$2);}"); plus.insertAfter("System.out.println((new Date()));"); screen.writeFile(); Method plus1 = screen.toClass().getMethod("plus", int.class,int.class); Screen screen1 = Screen.class.newInstance(); plus1.invoke(screen1,1,2); }}
0 0
- javassist 初步学习
- javassist学习
- javassist学习笔记
- Javassist学习总结
- javassist 学习笔记
- Javassist学习1:简介
- Javassist学习总结
- javassist 学习笔记
- Javassist学习总结
- Javassist 学习笔记1
- Javassist 学习笔记2
- javassist学习三
- javassist学习二
- javassist学习一
- Javassist学习总结
- Javassist学习总结
- javassist 学习笔记
- Javassist学习总结
- 解决Android Studio的adb not response。。。错误
- 第七周-项目5 -排队看病模拟
- Masonry介绍与使用实践:快速上手Autolayout
- Hadoop2.x.x伪分布式环境搭建、测试
- 论set和map
- javassist 初步学习
- 微软今天的Windows 10硬件发布会汇总:手机瞬间变PC
- 在PostgreSQL中用线性回归分析linear regression做预测
- js验证
- 基于redis分布式缓存实现(新浪微博案例)
- RabbitMQ使用不当导致的队列堵塞问题及解决办法
- 第七周 项目5-排队看病模拟
- arraylist和vector 与hashmap hashtable中的区别
- Socket 与 WebSocket