欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

maven 导入asm的依赖 & 简单入门

程序员文章站 2022-05-12 14:18:59
...

1. 项目结构

1.1. asm的仓库

maven仓库
maven 导入asm的依赖 & 简单入门

1.2 核心项目

1.2.1 org.objectweb.asm 和 org.objectweb.asm.signature

包定义了基于事件的API,并提供了类分析器和写入器组件。它们包含在 asm.jar 中。

1.2.2 org.objectweb.asm.util

包,位于asm-util.jar中,提供各种基于核心 API 的工具,可以在开发和调试 ASM 应用程序时使用。

1.2.3 org.objectweb.asm.commons

包提供了几个很有用的预定义类转换器,它们大 多 是基于核心 API 的。这个包包含在 asm-commons.jar中。

1.2.4 org.objectweb.asm.tree

包,位于asm-tree.jar 存档文件中,定义了基于对 象的 API,并提供了一些工具,用于在基于事件和基于对象的表示方法之间进行转换。

1.2.5 org.objectweb.asm.tree.analysis

包提供了一个类分析框架和几个预定义的 类 分析器,它们以树 API 为基础。这个包包含在 asm-analysis.jar 文件中。

1.3 其他项目

可以看出来1.2描述的几个包和1.1仓库是基本对应的。
但是除了asm-allasm-parent,与asm-debug等。

1.3.1 asm-all和asm-parent

asm-all包含了asm-parent,asm-parent 包含了所有的依赖。
一般来讲,使用者希望导入一个总的jar,其中包含子项目的jar。但是asm-all目前只停留在version 5.2,而最新子项目版本已经是8.1,不推荐使用。

  • asm-all 的pom
<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm-parent</artifactId>
    <version>5.2</version>
  </parent>

  <name>ASM All</name>
  <groupId>org.ow2.asm</groupId>
  <artifactId>asm-all</artifactId>
  <packaging>jar</packaging>
  
</project>
  • asm-parent的pom
    parent包含了子项目的依赖
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                        http://maven.apache.org/maven-v4_0_0.xsd">

  <parent>
    <artifactId>ow2</artifactId>
    <groupId>org.ow2</groupId>
    <version>1.3</version>
  </parent>
 
  <modelVersion>4.0.0</modelVersion>

  <artifactId>asm-parent</artifactId>
  <groupId>org.ow2.asm</groupId>
  <version>5.2</version>
  <packaging>pom</packaging>

  <name>ASM</name>
  <description>A very small and fast Java bytecode manipulation framework</description>
  <url>http://asm.objectweb.org/</url>
  
  <organization>
    <name>ObjectWeb</name>
    <url>http://www.objectweb.org/</url>
  </organization>
  <inceptionYear>2000</inceptionYear>
  
  <licenses>
    <license>
      <name>BSD</name>
      <url>http://asm.objectweb.org/license.html</url>
    </license>
  </licenses>

  <developers>
    <developer>
      <name>Eric Bruneton</name>
      <id>ebruneton</id>
      <email>aaa@qq.com</email>
      <roles>
        <role>Creator</role>
        <role>Java Developer</role>
      </roles>
    </developer>
    <developer>
      <name>Eugene Kuleshov</name>
      <id>eu</id>
      <email>aaa@qq.com</email>
      <roles>
        <role>Java Developer</role>
      </roles>
    </developer>
    <developer>
      <name>Remi Forax</name>
      <id>forax</id>
      <email>aaa@qq.com</email>
      <roles>
        <role>Java Developer</role>
      </roles>
    </developer>
  </developers>

  <scm>
    <connection>scm:svn:svn://svn.forge.objectweb.org/svnroot/asm/trunk</connection>
    <developerConnection>scm:svn:svn+ssh://${maven.username}@svn.forge.objectweb.org/svnroot/asm/trunk</developerConnection>
    <url>http://svn.forge.objectweb.org/cgi-bin/viewcvs.cgi/asm/trunk/</url>
  </scm>
  
  <issueManagement>
    <url>http://forge.objectweb.org/tracker/?group_id=23</url>
  </issueManagement>

  <dependencyManagement>
    <dependencies>

      <dependency>
        <artifactId>asm</artifactId>
        <groupId>${project.groupId}</groupId>
        <version>${project.version}</version>
      </dependency>

      <dependency>
        <artifactId>asm-tree</artifactId>
        <groupId>${project.groupId}</groupId>
        <version>${project.version}</version>
      </dependency>

      <dependency>
        <artifactId>asm-analysis</artifactId>
        <groupId>${project.groupId}</groupId>
        <version>${project.version}</version>
      </dependency>

      <dependency>
        <artifactId>asm-commons</artifactId>
        <groupId>${project.groupId}</groupId>
        <version>${project.version}</version>
      </dependency>

      <dependency>
        <artifactId>asm-util</artifactId>
        <groupId>${project.groupId}</groupId>
        <version>${project.version}</version>
      </dependency>

      <dependency>
        <artifactId>asm-xml</artifactId>
        <groupId>${project.groupId}</groupId>
        <version>${project.version}</version>
      </dependency>

    </dependencies>
  </dependencyManagement>

  <mailingLists>
    <mailingList>
      <name>ASM Users List</name>
      <subscribe>aaa@qq.com?subject=subscribe%20asm</subscribe>
      <unsubscribe>aaa@qq.com?subject=unsubscribe%20asm</unsubscribe>
      <post>aaa@qq.com</post>
      <archive>http://www.objectweb.org/wws/arc/asm</archive>
    </mailingList>
    <mailingList>
      <name>ASM Team List</name>
      <subscribe>aaa@qq.com?subject=subscribe%20asm-team</subscribe>
      <unsubscribe>aaa@qq.com?subject=unsubscribe%20asm-team</unsubscribe>
      <post>aaa@qq.com</post>
      <archive>http://www.objectweb.org/wws/arc/asm-team</archive>
    </mailingList>
  </mailingLists>

</project>

1.4 maven依赖

并不推荐使用1.3导入全部,因为版本太老了
这里开发者需要这么引入。asm-commonsasm-util都包含了,基本的 core api ,tree api, 和analysis

   <properties>
        <asm.version>8.0.1</asm.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <artifactId>asm</artifactId>
                <groupId>org.ow2.asm</groupId>
                <version>${asm.version}</version>
            </dependency>

            <dependency>
                <artifactId>asm-tree</artifactId>
                <groupId>org.ow2.asm</groupId>
                <version>${asm.version}</version>
            </dependency>

            <dependency>
                <artifactId>asm-analysis</artifactId>
                <groupId>org.ow2.asm</groupId>
                <version>${asm.version}</version>
            </dependency>

            <dependency>
                <artifactId>asm-commons</artifactId>
                <groupId>org.ow2.asm</groupId>
                <version>${asm.version}</version>
            </dependency>

            <dependency>
                <artifactId>asm-util</artifactId>
                <groupId>org.ow2.asm</groupId>
                <version>${asm.version}</version>
            </dependency>

            <dependency>
                <artifactId>asm-xml</artifactId>
                <groupId>org.ow2.asm</groupId>
                <version>${asm.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <dependencies>
        <dependency>
            <artifactId>asm-commons</artifactId>
            <groupId>org.ow2.asm</groupId>
            <version>${asm.version}</version>
        </dependency>

        <dependency>
            <artifactId>asm-util</artifactId>
            <groupId>org.ow2.asm</groupId>
            <version>${asm.version}</version>
        </dependency>
    </dependencies>

核心的包都具备了,是版本8.0.1
maven 导入asm的依赖 & 简单入门

2. IDEA的插件

装两个插件。
ASM Bytecode outlinehexview

2.1 ASM Bytecode outline 插件

  • 源码&字节码
    maven 导入asm的依赖 & 简单入门
  • 等价的ASM API
    maven 导入asm的依赖 & 简单入门

2.1 hexview插件

仅仅是以16进制显示.class文件
这个是真正的字节码,而asm插件中的字节码,是以人类可读的方式处理过。类似javap
maven 导入asm的依赖 & 简单入门

3. asm的使用示例

这一步门槛比较高,需要对java 字节码的知识。和ASM 有全面的了解。

  • java 字节码知识推荐 《深入理解jvm 字节码》jvm 规范比对着看
  • ASM 推荐阅读官方指导手册,写的很容易懂。博客里提供了中英两版,比对者看。

3.2 demo

《深入理解jvm 字节码》中的例子,使用基于事件core api基于文档模型tree API。如果具备字节码结构的知识、字节码指令知识、栈帧的模型的知识,去理解下面的例子非常容易,因为对类的加工,本质是增删改查字节码内容而已。

4. bytebuddy的示例

直接看bytebuddy官网用处不大,介绍文档还是比较简陋的。我是文档和源码比对者读的。

bytebuddy是基于ASM写的一个工具。也是用来对类进行加工的。很多API的模型继承与ASM,直接阅读bytebuddy官方文档和源码是十分费解的。建议先学习ASM

下面用bytebuddy演示一个等价的例子。

相关标签: 字节码