`
nihaokid
  • 浏览: 9882 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

ASM ASMifierClassVisitor类应用

阅读更多

ASM是一个十分灵活高效的java字节码生成工具,他可以帮助我们动态的生成所需的字节码文件,也可以修改已存在的字节码使其满足我们新的需要,是一个功能强大的AOP工具。
ASM官网地址http://asm.ow2.org/,附件提供了官方guide很详细,以及ASM的api。
ASM本身功能强大灵活,为此付出的代价就是其功能函数粒度很细,写ASM代码有一种写汇编代码的感觉,不过开发者为此已经想好了解决办法,ASMifierClassVisitor类提供了:生成一个给定class文件的ASM代码的功能。

下面的代码就是利用ASM3.2中的ASMifierClassVisitor类生成 能够产生test类class文件的ASM代码 的代码。
package nihaokid.asm;

import java.io.InputStream;
import java.io.PrintWriter;

import org.objectweb.asm.*;package nihaokid.asm;
import org.objectweb.asm.util.ASMifierClassVisitor;
public class targetCode{
	public static void main(String[] args) throws ClassNotFoundException, IOException {
		ClassLoader cl = targetCode.class.getClassLoader();
		java.lang.Class<?> target = hhhhtest.class;
		InputStream in = cl.getResourceAsStream(target.getName().replace(".", "/")+".class");
		ClassReader cr = new ClassReader(in);
		ASMifierClassVisitor visitor = new ASMifierClassVisitor(new PrintWriter(System.out));
		cr.accept(visitor,0);
	}
}

 
以下贴出tset类的代码
package nihaokid.asm;

public class hhhhtest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		hhhhtest t = new hhhhtest();
		t.print();

	}
	
	public void print()
	{
		System.out.println("hello world!");
	}

}

 

 
执行targetCode,输出如下

import java.util.*;

import org.objectweb.asm.*;
import org.objectweb.asm.attrs.*;
public class hhhhtestDump implements Opcodes {

public static byte[] dump () throws Exception {

ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;

cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "nihaokid/asm/hhhhtest", null, "java/lang/Object", null);

cw.visitSource("hhhhtest.java", null);

{
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(3, l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
mv.visitInsn(RETURN);
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLocalVariable("this", "Lnihaokid/asm/hhhhtest;", null, l0, l1, 0);
mv.visitMaxs(1, 1);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(9, l0);
mv.visitTypeInsn(NEW, "nihaokid/asm/hhhhtest");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "nihaokid/asm/hhhhtest", "<init>", "()V");
mv.visitVarInsn(ASTORE, 1);
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLineNumber(10, l1);
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL, "nihaokid/asm/hhhhtest", "print", "()V");
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLineNumber(12, l2);
mv.visitInsn(RETURN);
Label l3 = new Label();
mv.visitLabel(l3);
mv.visitLocalVariable("args", "[Ljava/lang/String;", null, l0, l3, 0);
mv.visitLocalVariable("t", "Lnihaokid/asm/hhhhtest;", null, l1, l3, 1);
mv.visitMaxs(2, 2);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "print", "()V", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(16, l0);
mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
mv.visitLdcInsn("hello world!");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLineNumber(17, l1);
mv.visitInsn(RETURN);
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLocalVariable("this", "Lnihaokid/asm/hhhhtest;", null, l0, l2, 0);
mv.visitMaxs(2, 1);
mv.visitEnd();
}
cw.visitEnd();

return cw.toByteArray();
}
}
 

 

分享到:
评论

相关推荐

    cglib 和asm jar包

    总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是...

    asm.jar各个版本

    asm-1.3.3.jar, asm-1.3.4.jar, asm-1.3.5.jar, asm-1.4.1.jar, asm-1.4.2.jar, asm-1.4.3.jar, asm-1.4.jar, asm-1.5.1.jar, asm-1.5.2.jar, asm-1.5.3.jar, asm-2.0.jar, asm-2.1.jar, asm-2.2.1-sources.jar, asm...

    asm4-guide.pdf

    Java的asm文档,来自官方。asm4-guide.pdf。ASM 是一个 Java 字节码操控框架。...ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。说白了asm是直接通过字节码来修改class文件。

    asm 最新版手册

    ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在...ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类

    asm操作指南(中文)

    ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class...

    ASM4中文使用指南.zip

    ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以...ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。

    asm5.0 源码+demo+doc

    ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。 与 BCEL 和 SERL 不同,ASM 提供了更为现代的编程模型。对于 ASM 来说,Java class 被描述为一棵树;使用 “Visitor” 模式...

    asm-9.0.jar

    ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件...

    F5 ASM应用安全管理测试方案.docx

    F5 ASM应用安全管理测试方案.docx

    汇编工具ASM汇编工具ASM汇编工具ASM汇编工具ASM

    汇编工具ASM汇编工具ASM汇编工具ASM汇编工具ASM汇编工具ASM

    各种oracleasm rpm包(Linux下配置ASM使用)

    包含如下oracleasm包: kmod-oracleasm-2.0.6.rh1-3.el6.x86_64.rpm oracleasm-2.0.8-4.el6_6.src.rpm oracleasm-2.0.8-6.el6_7.src.rpm oracleasm-2.0.8-8.el7.src.rpm oracleasm-2.0.8-15.el7.centos.src.rpm ...

    ASM 4 Guide 中文版

    ASM是一个JAVA字节码分析、创建和修改的开源应用框架。它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。在ASM中提供了诸多的API用于对类的内容进行字节码操作的方法...

    ASM插桩在Android项目中的应用

    ASM插桩在Android项目中的应用 博客地址:https://blog.csdn.net/qq_32019367/article/details/125798607

    EditPlus(附asm.acp,asm.stx)

    EditPlus是很好用的编辑软件 但网上下的很多EP版本需要自己添加asm.acp,asm.stx,不是很方便 这个里面附带了asm.acp,asm.stx

    asm-9.1-API文档-中文版.zip

    赠送jar包:asm-9.1.jar; 赠送原API文档:asm-9.1-javadoc.jar; 赠送源代码:asm-9.1-sources.jar; 赠送Maven依赖信息文件:asm-9.1.pom; 包含翻译后的API文档:asm-9.1-javadoc-API文档-中文(简体)版.zip; ...

    ASM操作字节码,动态生成Java类class文件

    ASM操作字节码,动态生成Java类class文件,模拟Spring的AOP实现原理。

    开发工具 asm-5.1

    开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具...

    asm4.1 jar+demo+doc

    ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。 与 BCEL 和 SERL 不同,ASM 提供了更为现代的编程模型。对于 ASM 来说,Java class 被描述为一棵树;使用 “Visitor” 模式...

    ASM1061原理图

    ASM1061 原理图 PCIE转2 port Sata芯片 ASM1061 原理图 PCIE转2 port Sata芯片

Global site tag (gtag.js) - Google Analytics