`
wendal
  • 浏览: 21031 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Nutz:基于ASM的Nut.Aop实现

    博客分类:
  • Nutz
阅读更多
Nutz: 一个很不错的SSH替代方案
http://code.google.com/p/nutz/

研究了一段时间了, 整个项目现时只依赖javassist.

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

而, nutz依赖javassist只有Aop.

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

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

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

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

完成!

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

或者可以在附件中找到源码. 版本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();
	}


好. 欢迎拍砖. 狠狠地拍!!
7
2
分享到:
评论
7 楼 zozoh 2009-12-09  
wendal 写道
换上后, 运行AllWithoutDB全部pass.

6 楼 wendal 2009-12-09  
换上后, 运行AllWithoutDB全部pass.
5 楼 wendal 2009-12-09  
恩, 感谢大家支持. 这两天又完善了一下,添加了一下测试.
如果有时间,最好能帮忙测试一下. (*^__^*) 嘻嘻……

当如果要切换到这个实现, 只需要改一下org.nutz.ioc.aop.impl.DefaultMirrorFactory的public <T> Mirror<T> getMirror(Class<T> type, String name)方法, 将:
ClassAgent ca = new JavassistClassAgent();

改为:
ClassAgent ca = new AsmClassAgent();

就可以了.毕竟整个Nutz,只有这里显示依赖JavassistClassAgent
4 楼 vb2005xu 2009-12-09  
我也是这么想的
3 楼 birdwindy 2009-12-08  
 
这样nutz就更小了,支持~~~~
wendal幸苦了
2 楼 zozoh 2009-12-07  
要不,新的实现就不依赖 Javassist 了,直接依赖 ASM 得了 
1 楼 zozoh 2009-12-07  

这个实现其实比内置的 Javassist 的要好。

本文收录了: http://code.google.com/p/nutz/wiki/resources
jar 包也传上去了:
http://code.google.com/p/nutz/downloads/detail?name=nutz.aop-asm.jar&can=2&q=#makechanges

相关推荐

    nutz-1.r.60.jar

    nutz-1.r.60.jar

    nutz-1.r.62.jar

    nutz-1.r.62.jar 的jar包 可以解决中文乱码,设置字符编码等等

    nutz-1.b.48-manual.pdf 文档

    java 框架 nutz-1.b.48-manual.pdf

    nutz-1.b.43-jdk6.jar

    nutz-1.b.43-jdk5.jar 资源包

    nutz-1.r.62.zip

    nutz-1.r.62.zip 强大的Java框架,里面有许多好玩的方便的约定配置,有兴趣的可以下载再看看

    nutz-1.r.61.r2.jar包

    nutz-1.r.61.r2-发布包_修正JDK6兼容性

    nutz-1.b.43-jdk5.jar

    nutz-1.b.43-jdk5.jar 资源包

    nutz-1.b.52.zip

    Nutz, 它是一组轻便小型的框架的集合。...如果你觉得 Java 语法不如 Ruby 便捷, Nutz.Castor 以及 Nutz.Lang 专为你设计 如果你以前根本没接触过 SSH ,只使用 JDBC 编程, 整个 Nutz 专门为你设计

    nutz-1.b.49.r2.zip

    Nutz是对于Java程序员来说,除SSH之外的另一个选择。当然,它是开源的,并且是完全免费的。同时也是商业友好的(Licensed under the Apache License, Version 2.0)。

    nutz-1.a.25_jdoc.zip

    nutz-1.a.25_jdoc.zip nutz-1.a.25_jdoc.zipnutz-1.a.25_jdoc.zip

    nutz-1.b.49-manual.pdf

    nutz 框架nutz-1.b.49-manual.pdf,配置简单易懂

    nutz-1.r.61-发布包

    nutz-1.r.61-发布包

    使用Nutz[1.b.38]对数据库表的CRUD操作

    NULL 博文链接:https://gevin.iteye.com/blog/1132811

    在Nutz[1.b.38]中使用视图对关联数据表的操作

    NULL 博文链接:https://gevin.iteye.com/blog/1147922

    Nutz-1.b.38

    Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等整 -- 它所有功能均不依赖第三方 jar 文件。这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了当然你要使用其它...

    nutz-1.r.65.zip

    nutzboot1.65版jar包...............................................................................................希望对你有用

    nutz 使用手册 nutz-1.a.33-manual.pdf

    nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册

    nutz:从 code.google.compnutz 自动导出

    Nutz 对于 Java 程序员来说,除 SSH 之外,的另一个选择 项目目标 在力所能及的情况下,最大限度的提高Web开发人员的生产力。 项目各种资源地址 手册地址 (发布新版本时更新) (基本做到文档有变动就更新) (新手...

    nutz-1.b.40-manual.pdf

    •活 -- 各个部分可以独立使用,比如在 Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等 •整 -- 它所有功能均不依赖第三方 jar 文件。 这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 ...

    nutz-1.r.58

    nutz框架jar包

Global site tag (gtag.js) - Google Analytics