maven 导入asm的依赖 & 简单入门
asm项目结构
1. 项目结构
1.1. 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-all
和asm-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-commons
和asm-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
2. IDEA的插件
装两个插件。ASM Bytecode outline
与hexview
2.1 ASM Bytecode outline 插件
- 源码&字节码
- 等价的ASM API
2.1 hexview插件
仅仅是以16进制显示.class文件
这个是真正的字节码,而asm插件中的字节码,是以人类可读的方式处理过。类似javap
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演示一个等价的例子。
上一篇: J2SE总结(一)
推荐阅读
-
IDEA下Maven的pom文件导入依赖出现Auto build completed with errors的问题
-
maven快速入门第十一讲——依赖的传递性
-
IDEA 2020.1 版自动导入MAVEN依赖的方法(新版MAVEN无法自动导入/更新POM依赖、MAVEN设置自动更新、自动更新快捷键)
-
POI实现Excel导入导出所需的maven依赖以及import的包
-
解决idea使用maven仓库导入依赖慢的问题
-
maven依赖无法导入的解决方案
-
IDEA下Maven的pom文件导入依赖出现Auto build completed with errors的问题
-
maven 导入asm的依赖 & 简单入门
-
IDEA 2020.1 版自动导入MAVEN依赖的方法(新版MAVEN无法自动导入/更新POM依赖、MAVEN设置自动更新、自动更新快捷键)
-
maven快速入门第五讲——依赖的作用范围