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();
}
好. 欢迎拍砖. 狠狠地拍!!
分享到:
相关推荐
nutz-1.r.60.jar
nutz-1.r.62.jar 的jar包 可以解决中文乱码,设置字符编码等等
java 框架 nutz-1.b.48-manual.pdf
nutz-1.b.43-jdk5.jar 资源包
nutz-1.r.62.zip 强大的Java框架,里面有许多好玩的方便的约定配置,有兴趣的可以下载再看看
nutz-1.r.61.r2-发布包_修正JDK6兼容性
nutz-1.b.43-jdk5.jar 资源包
Nutz, 它是一组轻便小型的框架的集合。...如果你觉得 Java 语法不如 Ruby 便捷, Nutz.Castor 以及 Nutz.Lang 专为你设计 如果你以前根本没接触过 SSH ,只使用 JDBC 编程, 整个 Nutz 专门为你设计
Nutz是对于Java程序员来说,除SSH之外的另一个选择。当然,它是开源的,并且是完全免费的。同时也是商业友好的(Licensed under the Apache License, Version 2.0)。
nutz-1.a.25_jdoc.zip nutz-1.a.25_jdoc.zipnutz-1.a.25_jdoc.zip
nutz 框架nutz-1.b.49-manual.pdf,配置简单易懂
nutz-1.r.61-发布包
NULL 博文链接:https://gevin.iteye.com/blog/1132811
NULL 博文链接:https://gevin.iteye.com/blog/1147922
Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等整 -- 它所有功能均不依赖第三方 jar 文件。这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了当然你要使用其它...
nutzboot1.65版jar包...............................................................................................希望对你有用
nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册
Nutz 对于 Java 程序员来说,除 SSH 之外,的另一个选择 项目目标 在力所能及的情况下,最大限度的提高Web开发人员的生产力。 项目各种资源地址 手册地址 (发布新版本时更新) (基本做到文档有变动就更新) (新手...
•活 -- 各个部分可以独立使用,比如在 Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等 •整 -- 它所有功能均不依赖第三方 jar 文件。 这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 ...
nutz框架jar包