`
wendal
  • 浏览: 21397 次
  • 性别: 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.zip

    2. `nutz-1.r.62-sources.jar`:提供了框架的源代码,开发者可以通过查看源码理解Nutz的内部实现,便于学习和调试。这对于深入理解和自定义框架行为非常有帮助。 3. `nutz-1.r.62-manual.pdf` 和 `nutz-1.r.62-...

    nutz-1.r.62.jar

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

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

    标题中的"nutz-1.r.61.r2.jar"是一个特定版本的Nutz框架的Java库文件。Nutz是一个开源的Java框架,它旨在简化Web开发,提供一系列实用工具和强大的支持,使得开发者能够更高效地进行业务逻辑处理。这个版本号"1.r.61...

    nutz-1.r.61-发布包

    Nutz 是一个轻量级的Java框架,它集成了MVC、ORM、DAO、AOP、IOC等核心功能,适用于构建各种类型的Web应用。Nutz的设计理念是简洁实用,它提供了丰富的API和工具,让开发者能更高效地进行开发工作。 2. **Nutz-1.r...

    nutz-1.r.58

    3. `nutz-1.r.58-sources.jar`:这个文件提供了Nutz框架的源代码,对于想要深入研究Nutz内部实现或者进行二次开发的开发者来说非常有价值。通过查看源码,开发者可以更直观地理解框架的工作原理,以便更好地利用和...

    nutz-1.b.43-jdk6.jar

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

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

    Nutz框架可以在WEB-INF/lib下仅使用一个nutz.jar来运行一个Web应用,前提是开发者自行添加必要的jar包,如连接池和数据库驱动等。对于那些希望尝试新东西、愿意成为NutzCommitters的开发者,Nutz提供了相应的指南和...

    nutz-1.r.57的JDK1.5编译

    Nutz是一个轻量级、高性能的Java开发框架,它的核心组件包括了ORM、AOP、MVC等,为开发者提供了一套完整的开发工具集。在Java开发领域,JDK版本的选择至关重要,因为不同版本的JDK可能会影响到代码的兼容性和性能。...

    nutz-1.a.25_jdoc.zip

    Nutz 是一个全面而强大的Java开发框架,由国内开发者团队创建,旨在简化企业级Web应用的开发过程。Nutz 框架集成了许多功能,包括MVC、ORM、DAO、JSON、AJAX、安全控制等,为Java程序员提供了一站式的解决方案。...

    nutz-1.b.49-manual.pdf

    - Aop:实现轻便快速的面向切面编程。 - Plugin:提供轻便的插件机制。 - Resource:支持资源扫描,且所有这些功能均不依赖第三方jar包。 3. Nutz框架的应用目标群体: - 如果开发中使用Hibernate觉得过于繁琐...

    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)。

    基于Java全栈开发的Nutz框架:Mvc/Ioc/Aop/Dao/Json一体化设计源码

    该项目为全栈Java开发,采用Nutz框架实现Mvc/Ioc/Aop/Dao/Json一体化设计,源码包含2307个文件,涵盖1742个Java源文件、208个man文档、143个png图片、47个jpg图片、22个js脚本、21个psd设计文件、16个xml文件、13个...

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

    该框架不依赖第三方 jar 包,只需引入 nutz.jar 即可使用全部功能。 #### 二、Nutz 主要组件及其用途 - **Dao**:提供对 JDBC 的薄封装,简化数据库操作。支持事务管理,但不提供缓存机制。 - **Ioc**:提供基于 ...

    nutz初使用之MVC HelloWorld (netbeans html,jquery版)

    在Nutz中,控制器通常是一个实现了`org.nutz.mvc.annotation.Controller`注解的类。例如,我们可以创建一个名为`HelloController`的类,其中有一个`hello`方法,这个方法使用`@Get`或`@Post`注解来指定HTTP请求类型...

    SpringMVC+Nutz框架介绍范本模板.pdf

    .`SpringMVC+Nutz框架介绍范本模板.pdf

    SpringMVC+Nutz框架介绍范本模板.docx

    .`SpringMVC+Nutz框架介绍范本模板.docx

    Nutz-1.b.38

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

Global site tag (gtag.js) - Google Analytics