ASM

在讲 ASM 以前 你须要对 .class字节码有一个较为深入的认识。请参考这两篇文章java

JVM 基础概念数组

机器码 指令 汇编语言 的关系bash

经过第一篇文章,咱们知道 .class字节码在jvm虚拟机中就是机器码。jvm

而后第二篇文章告诉咱们 机器码有对应的指令集和汇编语言工具

那么咱们能够思考一下,.class字节码做为jvm虚拟机中的机器码,有没有相似于指令集和汇编语言这样的工具呢?post

答案是有,ASM就是这样的工具spa

做用

咱们知道java这门语言,是不支持在运行时,对一个类进行修改(好比新增一个方法)。hibernate

但ASM 能够。3d

ASM能够动态修改已经编译过的.class字节码。所谓的动态修改指的是在运行时,在内存中完成的。code

ASM 如何修改一个class 字节码

ASM的核心呢主要有三个类

  • ClassReader
  • ClassWriter
  • ClassVisitor

用这三个类就能够解析一个class 字节码, 得到字段、方法了等信息,还能够对这些信息进行修改,最终造成一个表明新class 的字节码数组

一个简单的ASM实例

上面的代码是什么意思呢,其实就是 Hello word

public static void main(String[] args) {
    System.out.println("Hello word!");
}    
复制代码

ASM的应用

因为ASM 在JVM虚拟机中至关因而 指令集和汇编语言同样的存在,所以它十分强大,应用范围也很广。

常常使用的Spring , hibernate 的最核心的功能就用到了 ASM。

没有ASM, Jython、JRuby 根本就移植不到jvm虚拟机中

没有ASM, Clojure, Groovy这些语言也无法在jvm虚拟机中运行

ASM 名字的由来

ASM的做者在为该工具取名的时候,也是煞费苦心,后来它想到了 C语言中 _asm_ 这个关键字,能够运行在C语言中写点汇编,做者以为很不错,就取名为ASM

尾巴

ASM 对 jvm虚拟机的生态作出的重大贡献,原来JVM中只有Java一门语言,如今JVM中语言多的都选很少来

相关文章
相关标签/搜索