`
nihaokid
  • 浏览: 10184 次
  • 性别: 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();
}
}
 

 

分享到:
评论

相关推荐

    ASM插桩在Android项目中的应用

    ASM插桩在Android项目中的应用是一种高级技术,它涉及到Android应用开发、性能优化以及调试等多个领域。ASM是一个Java字节码操控和分析框架,它允许动态生成类或修改已有的类,尤其适用于运行时代码增强和静态代码...

    ASM1083 PCIe转PCI芯片数据表

    4. 广泛的应用场景:ASM1083 的应用场景非常广泛,包括服务器应用、嵌入式系统应用、工业控制应用等。 ASM1083 PCIe转PCI芯片数据表是一款功能强大、性能出色的PCIe转PCI桥接芯片,能够满足各种应用场景的需求。

    asm 最新版手册

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

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

    2. 防command injection攻击:command injection允许攻击者执行非预期的系统命令,测试会模拟这类攻击,检验ASM是否能防止命令注入导致的安全风险。 3. 防XSS攻击:XSS(跨站脚本)攻击允许攻击者在用户浏览器中...

    ASM.rar_asm 应用

    在本文中,我们将深入探讨ASM语言在嵌入式系统中的应用,特别是针对PIC18F452微控制器的TMR2(Timer2)模块如何用于生成2KHz的对称方波。ASM是汇编语言的一种,它允许程序员直接控制硬件资源,从而实现高效的代码...

    asm操作指南(中文)

    - **高速与小型化**:ASM被设计为快速且占用空间小的库,这对于运行时需要动态生成或转换类的应用程序尤为重要。 - **兼容性**:支持最新的Java版本,如Java 7。 - **广泛的用户支持**:拥有庞大的用户社区,能够...

    cglib 和asm jar包

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

    ASM 1351.zip

    ASM 1351 是一款由ASMedia( ASM 微电子)公司开发的集成电路,主要应用于数据传输和接口控制领域。这个压缩包“ASM 1351.zip”包含了与ASM 1351相关的三个关键文件:一个固件升级工具、数据表以及设计套件。 1. **...

    asm-2.2.3.jar,asm-commons-2.2.3.jar,asm-util-2.2.3.jar

    - **代码热更新**:在不重启应用的情况下,ASM可以用来修改已加载的类,实现热修复或动态升级功能。 - **性能优化**:对字节码进行优化,比如去除无用的代码,或者调整逻辑以提高执行效率。 - **代码分析**:通过ASM...

    ASM4使用指南 ASM GUIDE

    8. **应用领域**:ASM4广泛应用于软件工程、系统架构设计、物联网系统、嵌入式系统等领域,尤其对于那些需要处理大量并发交互和复杂逻辑的系统,ASM4的建模能力尤为突出。 9. **最佳实践**:使用ASM4时,应遵循良好...

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

    ASM是一个开源的Java字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。ASM可以被用来创建Java代理、实现元编程、甚至深入到Java虚拟机(JVM)层面进行性能优化。在Java开发中,ASM库允许我们直接...

    cglib-2.2.jar asm-tree.jar asm-commons.jar asm.jar

    ASM.jar包含了ASM库的所有核心类,这些类可以解析和生成Java字节码,从而实现对Java类的低级别操作。 **ASM-Commons** 是ASM库的一个扩展,提供了对ASM的一些常见用法的支持,如访问框架、类收集器、事件监听器等。...

    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...

    asm 6.0 工具集

    在实际应用中,ASM工具集常被用于以下场景: 1. **动态代理**:在运行时生成实现特定接口的代理类,用于实现AOP或事件驱动编程。 2. **代码混淆和优化**:改变类和方法的名字,删除无用代码,提高代码的安全性和...

    ASM7使用指南.pdf

    **范围**:ASM库主要用于处理Java类的字节码文件,包括但不限于类的读取、写入、转换和分析等功能。需要注意的是,类的加载过程不在ASM的处理范围内。 **模型**:ASM提供了两种API模型来实现类的生成和转换功能: ...

    asm4-guide.pdf

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

    ASM4手册中文版.pdf.zip

    下面将详细解释ASM4及其在JAVA开发中的应用。 首先,ASM4提供了访问和修改Java类和方法的全面API。它允许开发者在运行时动态生成和修改类,甚至可以在类加载到JVM之前或者之后进行操作。这对于AOP(面向切面编程)...

    1、ASM1064 DATASHEET; 2、ASM1064 参考原理图设计; 3、支持的SPI Flash清单

    这部分资料通常包括一个或多个ASM1064的典型应用电路示例,展示了如何将ASM1064整合到实际的电路板设计中。参考原理图会展示芯片与其他组件(如电容、电阻、电感等)的连接方式,以及电源管理、时钟配置、信号完整...

Global site tag (gtag.js) - Google Analytics