ASM 系列详细教程-01-ASM 入门案例详细教程

ASM是一款高性能的Java字节码操作和分析框架,适用于动态类生成和现有类的字节码修改。它提供了丰富的字节码转换和分析算法,支持最新Java版本,具有简单、模块化的API,广泛应用于类文件的深入学习、接口组件分析、方法结构解析等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ASM

ASM 是一个通用的Java字节码操作和分析框架。

它可以用来修改现有的类或动态地生成类,直接以二进制形式。

ASM提供了一些通用的字节码转换和分析算法,可以从这些算法中构建自定义复杂的转换和代码分析工具。

ASM提供与其他Java字节码框架类似的功能,但主要关注性能。

因为它的设计和实现都尽可能地小和快,所以非常适合在动态系统中使用(当然也可以以静态的方式使用,例如在编译器中)。

特性

ASM 并不是生成和转换已编译Java类的唯一工具,但它是最近和最有效的工具之一。

可以从 http://asm.objectweb.org 下载。其主要优点有:

  • 它有一个简单、设计良好、模块化的API,易于使用。

  • 为最新的 Java 版本提供支持。

  • 它很小,速度很快,而且非常健壮。

  • 其庞大的用户社区可以为新用户提供支持。

  • 它的开放源码许可允许你以任何你想要的方式使用它。

专题学习目录

ASM 系列详细教程-01-ASM 入门简介

ASM 系列详细教程-02-ASM 整体概览

ASM 系列详细教程-03-ASM 类文件深入学习

ASM 系列详细教程-04-ASM interface and components 接口和组件

ASM 系列详细教程-05-ASM class 工具类

ASM 系列详细教程-06-ASM method struct 方法结构

ASM 系列详细教程-07-ASM 方法接口与组件

ASM 系列详细教程-08-ASM 方法工具类

ASM 系列详细教程-09-ASM 方法增强 aop 字节码实战

ASM 系列详细教程-10-ASM metadata 元数据之泛型

ASM 系列详细教程-11-ASM metadata 元数据之注解 annotation

ASM 系列详细教程-12-ASM metadata 元数据之调试 debug

ASM 系列详细教程-13-ASM core api 向后兼容

ASM 系列详细教程-14-ASM core api 向后兼容守则

ASM 系列详细教程-15-ASM ReflectASM 入门案例详细介绍及实战

ASM 系列详细教程-16-ASM Tree api 类接口与组件

ASM 系列详细教程-17-ASM Tree api 类组件组成详解

ASM 系列详细教程-18-ASM Tree api 方法接口与组件

ASM 系列详细教程-19-ASM Tree api 方法组件组成

ASM 系列详细教程-20-ASM Method 方法分析介绍

ASM 系列详细教程-21-ASM Method 方法分析接口与组件

ASM 系列详细教程-22-ASM Metadata 元数据 Generic Annotation Debug

ASM 系列详细教程-23-ASM Tree API 向后兼容能力

快速入门

jar 引入

<dependency>
	<groupId>org.ow2.asm</groupId>
	<artifactId>asm-all</artifactId>
	<version>5.1</version>
</dependency>

Hello World

  • HelloWorld.java
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.GeneratorAdapter;
import org.objectweb.asm.commons.Method;

import java.io.FileOutputStream;
import java.io.PrintStream;

/**
 * <p> </p>
 *
 * <pre> Created: 2018/7/20 下午2:01  </pre>
 * <pre> Project: asm  </pre>
 *
 * @author houbinbin
 * @version 1.0
 * @since JDK 1.7
 */
public class Bean extends ClassLoader implements Opcodes {

    public static void main(final String args[]) throws Exception {
        // creates a ClassWriter for the Example public class,
        // which inherits from Object

        ClassWriter cw = new ClassWriter(0);
        cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);
        MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null,
                null);
        mw.visitVarInsn(ALOAD, 0);
        mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
        mw.visitInsn(RETURN);
        mw.visitMaxs(1, 1);
        mw.visitEnd();
        mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main",
                "([Ljava/lang/String;)V", null, null);
        mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
                "Ljava/io/PrintStream;");
        mw.visitLdcInsn("Hello world!");
        mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println",
                "(Ljava/lang/String;)V");
        mw.visitInsn(RETURN);
        mw.visitMaxs(2, 2);
        mw.visitEnd();
        byte[] code = cw.toByteArray();
        FileOutputStream fos = new FileOutputStream("Example.class");
        fos.write(code);
        fos.close();
        Bean loader = new Bean();
        Class exampleClass = loader
                .defineClass("Example", code, 0, code.length);
        exampleClass.getMethods()[0].invoke(null, new Object[]{null});

        // ------------------------------------------------------------------------
        // Same example with a GeneratorAdapter (more convenient but slower)
        // ------------------------------------------------------------------------

        cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);
        Method m = Method.getMethod("void <init> ()");
        GeneratorAdapter mg = new GeneratorAdapter(ACC_PUBLIC, m, null, null,
                cw);
        mg.loadThis();
        mg.invokeConstructor(Type.getType(Object.class), m);
        mg.returnValue();
        mg.endMethod();
        m = Method.getMethod("void main (String[])");
        mg = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC, m, null, null, cw);
        mg.getStatic(Type.getType(System.class), "out", Type
                .getType(PrintStream.class));
        mg.push("Hello world!");
        mg.invokeVirtual(Type.getType(PrintStream.class), Method
                .getMethod("void println (String)"));
        mg.returnValue();
        mg.endMethod();
        cw.visitEnd();
        code = cw.toByteArray();
        loader = new Bean();
        exampleClass = loader.defineClass("Example", code, 0, code.length);
        exampleClass.getMethods()[0].invoke(null, new Object[]{null});
    }

}

拓展阅读

更多技术文章,生活趣事,尽在【老马啸西风】。

老马啸西风

应用实战

ASM-Tool

基于 ASM 实现比 Spring BeanUtil.copyProperties 性能更好的拷贝框架

参考文档

快速入门

ASM介绍及简易教程

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值