Nutz:基于ASM的Nut.Aop实现

Nutz: 一个很不错的SSH替代方案
[url]http://code.google.com/p/nutz/[/url]

研究了一段时间了, 整个项目现时只依赖[color=red]javassist[/color].

但是,javassist的确很大,300多k, 整个nutz才500k, 有喧宾夺主之意.

而, nutz依赖javassist只有Aop.

故, 我在闲暇之余, 用asm 3.2实现了nutz的aop部分.

实现效果: 约30K, 压缩后15k, 加上asm 3.2的43k, 加起来不到60K. (*^__^*) 嘻嘻……

换句话说, 如果[color=red]换上这个实现, nutz+asm 才 640k左右[/color]. O(∩_∩)O哈哈~ 狂笑中

整个aop的实现, 分成几个部分:
1. 写入模板字段
2. 继承父类的构造方法
3. 覆写需要aop拦截的方法
4. 写入模板方法
5. 生成类的二进制数据, 交给ClassLoader生成Class实例
6. 注入模板字段的值

完成!

代码在: [url]http://code.google.com/p/nutzlab/source/browse/#svn/trunk/Nutz.Aop-ASM[/url]

或者可以在附件中找到源码. 版本rev 81

代码片段1:

public byte[] toByteArray(){
addField();
addConstructors();
addAopMethods();
enhandMethod();
return cw.toByteArray();
}


代码片段2(写入其中一个模板方法):

static void addMethod_before(ClassVisitor cv, String _Nut_myName){
MethodVisitor mv = cv.visitMethod(ACC_PRIVATE + ACC_VARARGS, "_Nut_before", "(I[Ljava/lang/Object;)Z", null, null);
mv.visitCode();
mv.visitFieldInsn(GETSTATIC, _Nut_myName, "_$$Nut_methodArray", "[Ljava/lang/reflect/Method;");
mv.visitVarInsn(ILOAD, 1);
mv.visitInsn(AALOAD);
mv.visitVarInsn(ASTORE, 3);
mv.visitFieldInsn(GETSTATIC, _Nut_myName, "_$$Nut_methodInterceptorList", "[Ljava/util/List;");
mv.visitVarInsn(ILOAD, 1);
mv.visitInsn(AALOAD);
mv.visitVarInsn(ASTORE, 4);
mv.visitInsn(ICONST_1);
mv.visitVarInsn(ISTORE, 5);
mv.visitVarInsn(ALOAD, 4);
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "iterator", "()Ljava/util/Iterator;");
mv.visitVarInsn(ASTORE, 7);
Label l0 = new Label();
mv.visitJumpInsn(GOTO, l0);
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitFrame(F_FULL, 8, new Object[] { _Nut_myName, INTEGER, "[Ljava/lang/Object;", "java/lang/reflect/Method", "java/util/List", INTEGER, TOP, "java/util/Iterator" }, 0, new Object[] {});
mv.visitVarInsn(ALOAD, 7);
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;");
mv.visitTypeInsn(CHECKCAST, "org/nutz/aop/MethodInterceptor");
mv.visitVarInsn(ASTORE, 6);
mv.visitVarInsn(ILOAD, 5);
mv.visitVarInsn(ALOAD, 6);
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 3);
mv.visitVarInsn(ALOAD, 2);
mv.visitMethodInsn(INVOKEINTERFACE, "org/nutz/aop/MethodInterceptor", "beforeInvoke", "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Z");
mv.visitInsn(IAND);
mv.visitVarInsn(ISTORE, 5);
mv.visitLabel(l0);
mv.visitFrame(F_SAME, 0, null, 0, null);
mv.visitVarInsn(ALOAD, 7);
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z");
mv.visitJumpInsn(IFNE, l1);
mv.visitVarInsn(ILOAD, 5);
mv.visitInsn(IRETURN);
mv.visitMaxs(5, 8);
mv.visitEnd();
}


好. 欢迎拍砖. 狠狠地拍!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值