一、什么是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 }); } }
相关推荐
asm-3.3.1.jar是一个Java字节码操纵框架,它可以在二进制形式下动态生成stub类或者其他代理类,同时也可以在类被装载入JVM之前动态地进行修改。这款工具具有类似于BCEL和SERP等工具包的功能,但设计得更小更快速,...
第九课 锁 baise锁 轻量级锁 自旋锁 介绍JVM中对多线程锁的实现。 第十课 class文件结构 ASM库介绍 介绍JVM规范中的最重要的内容——Class文件结构,同时介绍ASM库的使用以及对class文件的修改。 第十一课 字节...
asm-analysis-3.2.jar 它包含了一个名为`AsmAnalysis`的类,这个类是ASM库的一部分,主要用于Java字节码的分析和修改。这个工具基于访问者模式实现,可以对字节码进行各种操作和分析。 ASM库提供了一套基于树API的...
ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class ...
《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行...第11章介绍了虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。
第11章介绍了Java虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。 《实战Java虚拟机——JVM故障诊断与性能优化》不仅适合Java程序员,还适合任何一名工作于Java虚拟机之上的研发人员、软件...
随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。...第11章介绍了虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。
用于使用ASM加载和修改字节码数据结构的基本软件包。 主对象是Cxt,它类似于ClassLoader,但有一些关键区别。 数据结构的类,字段和信息共享特征Info 。 关于访问这些结构,即使未定义, resolve也会始终返回有效的...
第11章介绍了Java虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。, 《实战Java虚拟机——JVM故障诊断与性能优化》不仅适合Java程序员,还适合任何一名工作于Java虚拟机之上的研发人员、软件...
Cglib代理,也叫作子类代理,它是在内存中...Cglib包的底层是通过使用一个小而块的字节码处理框架ASM来转换字节码并生成新的类.不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉.
第11章介绍了Java虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。, 《实战Java虚拟机——JVM故障诊断与性能优化》不仅适合Java程序员,还适合任何一名工作于Java虚拟机之上的研发人员、软件...
第11章介绍了Java虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。 《实战Java虚拟机——JVM故障诊断与性能优化》不仅适合Java程序员,还适合任何一名工作于Java虚拟机之上的研发人员、软件...
CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。 CGLIB缺点:对于final方法,无法进行代理。 三、CGLIB的...
最准确和可衡量的方法是查看Kotlin生成的可执行(.class)文件,这是JVM和Android DX工具都能看到的文件。 什么 从每个kotlin-compiler生成的类文件中,您将看到3个选项卡: 等效的Java代码 等效的Java字节码 十六...