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类
大家有兴趣的话,可以都去试试