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类 

 

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

 

你可能感兴趣的:(java,apache,eclipse,虚拟机,电信)