• ASM:(1)介绍


    原文:https://lsieun.github.io/java-asm-01/asm-intro.html

    ASM是什么?

    简单来说,ASM是一个操作Java字节码的类库

    为了能够更好的理解ASM是什么,我们需要来搞清楚两个问题:

    • 第一个问题,ASM的操作对象是什么呢?
    • 第二个问题,ASM是如何处理字节码(ByteCode)数据的呢?

    首先,我们来看第一个问题:ASM的操作对象是什么呢? 回答:ASM所操作的对象是字节码(ByteCode)数据。

    我们都知道,一个.java文件经过Java编译器(javac)编译之后会生成一个.class文件。 在.class文件中,存储的是字节码(ByteCode)数据,如下图所示。ASM所操作的对象就是字节码(ByteCode),而在许多情况下,字节码(ByteCode)的具体表现形式是.class文件。

    image-20220407140920881

    接着,我们来看第二个问题:ASM是如何处理字节码(ByteCode)数据的呢? 回答:ASM处理字节码(ByteCode)的方式是“拆分-修改-合并”。

    ASM处理字节码(ByteCode)数据的思路是这样的:第一步,将.class文件拆分成多个部分;第二步,对某一个部分的信息进行修改;第三步,将多个部分重新组织成一个新的.class文件。

    Wikipedia上,对ASM进行了如下描述:

    ASM provides a simple API for decomposing(将一个整体拆分成多个部分), modifying(修改某一部分的信息), and recomposing(将多个部分重新组织成一个整体) binary Java classes (i.e. ByteCode).

    ASM的版本发展

    对于ASM版本的发展,我们要说明两点:

    • 第一点,Java语言在不断发展,那么,ASM版本也要不断发展来跟得上Java的发展。
    • 第二点,在选择ASM版本的时候,要注意它支持的Java版本,来确保兼容性。

    比如说,我们常用的Java版本是Java 8和Java 11。针对Java 8版本,我们需要使用ASM 5.0版本,就能正常工作。对于Java 11版本,我们需要使用ASM 7.0版本,就能正常工作。当然,我们可以尽量使用较高的ASM版本。

    SM Release Release Date Java Support
    2.0 2005-05-17 Java 5 language support
    3.2 2009-06-11 support for the new invokedynamic code.
    4.0 2011-10-29 Java 7 language support
    5.0 2014-03-16 Java 8 language support
    6.0 2017-09-23 Java 9 language support
    6.1 2018-03-11 Java 10 language support
    7.0 2018-10-27 Java 11 language support
    7.1 2019-03-03 Java 13 language support
    8.0 2020-03-28 Java 14 language support
    9.0 2020-09-22 Java 16 language support
    9.1 2021-02-06 JDK 17 support
    9.2 2021-06-26 JDK 18 support

    ASM能够做什么

    通俗的理解

    • 父类:修改成一个新的父类
    • 接口:添加一个新的接口、删除已有的接口
    • 字段:添加一个新的字段、删除已有的字段
    • 方法:添加一个新的方法、删除已有的方法、修改已有的方法
    • ……(省略)

    专业的描述

    ASM is an all-purpose(多用途的;通用的) Java ByteCode manipulation(这里的manipulation应该是指generate和transform操作) and analysis framework. It can be used to modify existing classes or to dynamically generate classes, directly in binary form.

    The goal of the ASM library is to generate, transform and analyze compiled Java classes, represented as byte arrays (as they are stored on disk and loaded in the Java Virtual Machine).

    What ASM Can Do

    小总结:

    • generation:是从0到1的操作,是最简单的操作。也就是说,原来什么都没有,经过generation操作,会生成一个新的.class文件。
    • transformation:是从1到1的操作,是中度复杂的操作。也就是说,原来有一个.class文件,经过transformation操作,会生成一个新的.class文件。
    • analysis:是从1到0的操作,是最复杂的操作。也就是说,原来有一个.class文件,经过analysis操作,虽然有分析的结果,但是不会生成新的.class文件。

    为什么要学习ASM

    平常,我们使用Java语言进行开发,能够解决很多的问题。我们可以把Java语言解决问题的范围称之为“Java语言的世界”。那么,ASM起什么作用呢?ASM就是一处位于“Java语言的世界”边界上的一扇大门,通过这扇大门,我们可以前往“字节码的世界”。在“字节码的世界”里,我们会看到不一样的“风景”,能够解决不一样的“问题”。

    image-20220407142339418

    ASM往往在一些框架的底层起着重要的作用。接下来,我们介绍两个关于ASM的应用场景:Spring和JDK。这两个应用场景例子的目的,就是希望大家了解到ASM的重要性。

    Spring当中的ASM

    第一个应用场景,是Spring框架当中的AOP。 在很多Java项目中,都会使用到Spring框架,而Spring框架当中的AOP(Aspect Oriented Programming)是依赖于ASM的。具体来说,Spring的AOP,可以通过JDK的动态代理来实现,也可以通过CGLIB实现。其中,CGLib (Code Generation Library)是在ASM的基础上构建起来的,所以,Spring AOP是间接的使用了ASM。(参考自Spring Framework Reference Documentation8.6 Proxying mechanisms)。

    JDK当中的ASM

    第二个应用场景,是JDK当中的Lambda表达式。 在Java 8中引入了一个非常重要的特性,就是支持Lambda表达式。Lambda表达式,允许把方法作为参数进行传递,它能够使代码变的更加简洁紧凑。但是,我们可能没有注意到,其实,在现阶段(Java 8版本),Lambda表达式的调用是通过ASM来实现的

    rt.jar文件的jdk.internal.org.objectweb.asm包当中,就包含了JDK内置的ASM代码。在JDK 8版本当中,它所使用的ASM 5.0版本。

    如果我们跟踪Lambda表达式的编码实现,就会找到InnerClassLambdaMetafactory.spinInnerClass()方法。在这个方法当中,我们就会看到:JDK会使用jdk.internal.org.objectweb.asm.ClassWriter来生成一个类,将lambda表达式的代码包装起来。

    • LambdaMetafactory.metafactory() 第一步,找到这个方法
      • InnerClassLambdaMetafactory.buildCallSite() 第二步,找到这个方法
        • InnerClassLambdaMetafactory.spinInnerClass() 第三步,找到这个方法
  • 相关阅读:
    opacity背景层透明导致文字也透明
    [css3]叉叉旋转效果
    [css]当父元素的margin-top碰上子元素的margin-top
    Python_Mix*异常处理
    Python_Mix*OS模块,序列化模块种的json,pickle
    Python_Mix*random模块,time模块,sys模块,os模块
    Python_Mix*re模块基础方法,进阶,正则表达式的使用
    Python_Mix*re模块,元字符,量词
    Python_Mix*匿名函数,sorted,filter,map,递归函数,二分法查找
    Python_Mix*内置函数
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/16112173.html
Copyright © 2020-2023  润新知