`

jvm第9节-asm生成class字节码

阅读更多

一、什么是ASM

    ASM是一个JAVA字节码分析、创建和修改的开源应用框架。在ASM中提供了诸多的API用于对类的内容进行字节码操作的方法。与传统的BCEL和SERL不同,在ASM中提供了更为优雅和灵活的操作字节码的方式。目前ASM已被广泛的开源应用架构所使用,例如:Spring、Hibernate等。

二、ASM能干什么

    分析一个类、从字节码角度创建一个类、修改一个已经被编译过的类文件

三、ASM初探例子

通过字节码实现

public class Example {
	public static void main(String[] args) {
		int a = 6;
		int b = 7;
		int c = (a + b) * 3;
		System.out.println(c);
	}
}

 实现代码如下:

package com.jvm.day8.asm;

import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

/**
 * 用asm生成字节码
 * 
 * @Author:xuehan
 * @Date:2016年4月2日下午6:13:23
 */
public class ASMHelloWorld extends ClassLoader {

	public static void main(String[] args) throws Exception {
		ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
		cw.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC, "com/jvm/day8/asm/Example", null, "java/lang/Object", null);
		// 方法开始init
		MethodVisitor mw = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
		mw.visitVarInsn(Opcodes.ALOAD, 0); // this 入栈
		mw.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
		mw.visitInsn(Opcodes.RETURN);
		mw.visitMaxs(0, 0);
		mw.visitEnd(); // 方法init结束
		// main方法开始
		mw = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
		/**
		 * 使用ASM,通过字节码 完成以下代码: int a=6; int b=7; int c=(a+b)*3;
		 * System.out.println(c);
		 */
		// 把变量放入局部变量表里
		mw.visitIntInsn(Opcodes.BIPUSH, 6);
		mw.visitVarInsn(Opcodes.ISTORE, 3);
		mw.visitIntInsn(Opcodes.BIPUSH, 7);
		mw.visitVarInsn(Opcodes.ISTORE, 4);
		// 操作数栈
		mw.visitVarInsn(Opcodes.ILOAD, 3);
		mw.visitVarInsn(Opcodes.ILOAD, 4);
		mw.visitInsn(Opcodes.IADD);
		mw.visitIntInsn(Opcodes.BIPUSH, 3);
		mw.visitInsn(Opcodes.IMUL);
		mw.visitVarInsn(Opcodes.ISTORE, 2);
		// 打印出来
		mw.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
		mw.visitVarInsn(Opcodes.ILOAD, 2);
		mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(I)V");
		mw.visitInsn(Opcodes.RETURN);
		mw.visitMaxs(0, 0);

		mw.visitEnd(); // main方法结束

		final byte[] code = cw.toByteArray();

		ASMHelloWorld loader = new ASMHelloWorld();
		Class<?> exampleClass = loader.defineClass("com.jvm.day8.asm.Example", code, 0, code.length);
		exampleClass.getMethods()[0].invoke(null, new Object[] { null });

	}

}

 

0
6
分享到:
评论

相关推荐

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

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

    03 - ASM和ClassFile - 简书1

    ASM和ClassFile是Java世界中的两个重要概念,它们在字节码操作和理解Java虚拟机(JVM)内部工作原理方面起着关键作用。 首先,ClassFile是Java编译器生成的字节码文件的结构,它以二进制形式存储了类或接口的所有元...

    ASM字节码操作简单实例

    6. **生成字节码并加载到JVM**:最后,`ClassWriter`的`toByteArray`方法会生成字节码数组,然后可以使用`ClassLoader`的`defineClass`方法将字节码转换为类。 这个简单示例可能仅涉及一个或两个方法的增强,但实际...

    08 - ASM使用ClassWrite生成接口 - 简书1

    `ClassWriter`是ASM提供的一种用于创建字节码表示的类,它可以自动生成字节码的框架信息,使得我们能方便地构建Java类和接口。 首先,我们需要了解ASM的几个关键概念: 1. `ClassVisitor`: 这是ASM的核心接口,它...

    修改class字节码需要的工具.zip

    这个压缩包`修改class字节码需要的工具.zip`提供了几种常用的工具,帮助开发者实现这一目标。以下是这些工具的详细介绍以及如何使用它们。 1. **Luyten 0.5.4**: 这是一个跨平台的Java字节码查看器和编辑器,可以...

    cglib,字节码生成库是生成和转换Java字节码的高级API。它被aop、测试、数据访问框架用来生成动态代理对象和拦截字段访问。.zip

    CGlib库利用ASM库(一个底层的Java字节码操作和分析框架)来生成和修改字节码。通过这种方式,开发者可以在程序运行时动态地创建新的类或修改现有类的行为,而无需重新编译源代码。 **动态代理** CGlib常用于实现...

    Java Classloading Mechanism : ClassLoader & ASM & 动态字节码增强

    Java 类加载机制是Java运行时环境中的核心组成部分,它负责将类的字节码加载到JVM(Java虚拟机)中并实现类的实例化。深入理解这一机制有助于开发者优化程序性能、实现自定义加载逻辑以及进行动态字节码增强。在本篇...

    深入字节码 -- 使用 ASM 实现 AOP1

    5. **生成新字节码**:完成所有修改后,使用 ClassWriter 生成新的字节码,并保存为 `.class` 文件,或者直接在内存中使用。 ASM 的优点在于它的效率高,因为代码是在字节码级别插入的,避免了反射带来的性能损失。...

    字节码实战包含class,字节码.zip

    当我们使用javac命令编译Java源代码时,Java编译器会生成.class文件,每个文件包含一个或多个类或接口的字节码。字节码文件结构包括魔术数字、版本信息、常量池、访问标志、类索引、父类索引、接口索引集合、字段表...

    Java ASM,learn-java-asm-main.zip

    Java ASM 是一个强大的字节码操控和分析框架,它允许你在运行时动态生成类和接口,或者修改已存在的类。ASM 提供了低级别的访问,让你可以深入到 Java 类的内部结构,这对于创建代码生成器、编译器、性能监视工具等...

    [字节码系列]ObjectWeb ASM构建Method Monitor

    ObjectWeb ASM是一个轻量级且强大的Java字节码操控和分析框架,它允许程序员动态生成和修改类的字节码。本文将深入探讨如何使用ASM库来构建一个Method Monitor,以便监控和记录应用程序中方法的调用。 首先,了解...

    Gradle Plugin 修改其class 字节码的Demo

    本文将深入探讨如何使用Gradle插件来修改class字节码,这在进行代码混淆、性能优化或者实现特定功能时非常有用。我们将以"Gradle Plugin 修改其class 字节码的Demo"为例,探讨这一技术。 首先,我们需要了解什么是...

    Java字节码和asm入门资料

    ASM是一个开源的Java字节码操控和分析框架,它可以直接用来生成和修改Java类文件,是Java动态代理和字节码增强技术的重要工具。在深入学习Java字节码和ASM之前,我们需要先理解Java编译和运行的基本过程。 1. **...

    asm-all-3.3

    ASM库可以直接生成和修改Java类的字节码,为开发者提供了深入操作Java虚拟机(JVM)的能力。"asm-all-3.3"是ASM框架的一个版本集合,包含了3.3版本的所有组件和相关资源。 在ASM 3.3中,核心组件主要包括以下几个...

    asm-7.1.zip

    ASM 可以直接生成和分析Java虚拟机(JVM)的字节码,因此在很多领域都有广泛的应用,比如Java代理、AOP(面向切面编程)、代码生成以及动态语言的实现等。 标题中的“asm-7.1.zip”表明这是一个包含ASM库的压缩文件...

    15 - ASM之方法Frame - 简书1

    ASM(Abstract Syntax Method)是一种Java bytecode manipulation library,提供了对Java字节码的解析、修改和生成等功能。本文将详细介绍ASM之方法Frame的结构和工作原理。 JVM Architecture JVM Architecture由...

    asm-tree.jar

    `ClassReader`可以读取字节码并创建一个`ClassNode`实例,而`ClassWriter`则能根据修改后的`ClassNode`生成新的字节码。这种流程使得对字节码的修改变得高效且精确。 在提供的压缩包中,除了主文件`asm-tree.jar`...

    ASM使用指南-中文版

    ASM是一个强大的Java字节码操控和分析框架,它允许开发者动态生成或修改Java类和运行时的类。这个“ASM使用指南-中文版”提供了全面的教程和参考信息,帮助开发者深入理解并有效地利用ASM库。 ASM的核心功能在于...

    asm-3.1.jar

    4. **字节码生成器**:ASM提供了一些预定义的生成器类,如`ClassWriter`,它们可以将内存中的类模型转换回字节码,然后写入到文件或内存中。这使得开发者能够快速地构建出完整的类文件。 5. **性能优化**:由于ASM...

Global site tag (gtag.js) - Google Analytics