首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

asm动态生验方法

2012-08-25 
asm动态生成方法ASM是一套JAVA字节码生成架构。它可以动态生成二进制格式的stub类或其他代理类,或者在类被J

asm动态生成方法

ASM是一套JAVA字节码生成架构。它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。ASM 提供了与 BCEL( http://jakarta.apache.org/bcel )和SERP( http://serp.sourceforge.net/ )相似的功能,只有22K的大小,比起350K的BCEL和150K的SERP来说,是相当小巧的,并且它有更高的执行效率,是BCEL的7倍,SERP的11倍以上。ASM一贯的设计思想就是将其应用于动态生成领域,因此小巧和快捷一直是这个产品的设计和实现的指导思想。

此产品由法国电信公司的研发工程师Eric Bruneton负责。从2002年7月ASM的第一个版本发布至今,此产品已经升级了五次,日臻完美。到目前为止,ASM最新的版本是1.3.5,你可以去 http://asm.objectweb.org/ 下载。

ASM的最终目标是创建一个生成工具,可以被用来执行对任何类的处理操作(不像一些工具,比如Javassit,它只支持预先定义的类操作,然而在许多场合这一功能是有局限性的)。 不过这个网址需要翻¥墙才能访问到

?

用asm动态生成方法可以比对着class文件来写,这样就相对简单 例

?

//Java代码

System.out.println("Hello world!");

//编译成class

??? 0? getstatic java.lang.System.out : java.io.PrintStream [12]
??? 3? ldc <String "Hello world!"> [14]
??? 5? invokevirtual java.io.PrintStream.println(java.lang.String) : void [20]
??? 8? return

?

//用asm自动生成

???? MethodVisitor

???? // 为main方法创建一个MethodWriter
???? mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC,
??????????????? "main",
??????????????? "([Ljava/lang/String;)V",
??????????????? null,
??????????????? null);
???? // 使用System类的out成员类
???? mw.visitFieldInsn(
?????? GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
???? // pushes the "Hello World!" String constant
???? mw.visitLdcInsn("Hello world!");
???? // 调用System.out的'println' 函数
???? mw.visitMethodInsn(
?????? INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
???? mw.visitInsn(RETURN);
???? // 这段代码使用最多两个栈元素和两个本地变量
???? mw.visitMaxs(2, 2);

?

?

?

如上,可以很明显的看出, asm是按照class对应一行行的写的, 再不知道怎么动态生成的时候,这样是一个比较好的方法

?

http://download.forge.objectweb.org/eclipse-update/???这个插件很好,可以直接根据class 写出 asm类?

?

大家有兴趣的话,可以都去试试

?

热点排行