1. ASM簡介
ASM是被設(shè)計用于運行時的,離線的類生成和轉(zhuǎn)換,作用于已編譯好的Java class,并且被設(shè)計的盡可能的小巧快速,其目的是生成、轉(zhuǎn)換和分析以字節(jié)數(shù)組表示的已編譯 Java 類(它們在磁盤中的存儲 和在 Java 虛擬機中的加載都采用這種字節(jié)數(shù)組形式)。為此,ASM 提供了一些工具,使用高于字節(jié)級別的概念來讀寫和轉(zhuǎn)換這種字節(jié)數(shù)組,這些概念包括數(shù)值常數(shù)、字符串、Java 標(biāo)識符、Java 類型、Java 類結(jié)構(gòu)元素,等等。注意,ASM 庫的范圍嚴(yán)格限制于類的讀、寫、轉(zhuǎn)換和分析。具體來說,類的加載過程就超出了它的范圍之外。
2. 模型
ASM提供了兩種API模型,用來操作Class文件,一種是核心API,基于事件來表示類,另一種是樹API,以基于對象的形式表示類。基于對象的 API 構(gòu)建在基于事件的 API 之上。這兩個API可以類比于Java中兩種處理XML的框架,SAX和DOM,基于事件的類似于SAX,基于對象的類似于DOM。
基于事件的API,采用的設(shè)計模式中經(jīng)典的訪問者模式,后續(xù)會主要介紹核心API,詳細描述這一部分基于事件的API的使用,這里做概括性的說明,ASM在解析Class文件過程中,會把每個遇到的類元素,如限定符,常量池,一個字段,一個方法,注解等等轉(zhuǎn)換一個一個事件,基于事件發(fā)生的順序來調(diào)用訪問者類,并且還提供了一個類寫入器(特殊的訪問者類),由這些事件再次生成編譯后的類。
對基于對象的API感興趣,可以通過官方文檔來學(xué)習(xí) asm4-guide.pdf。
本文的內(nèi)容也大多來自于翻譯官方文檔和官方例子
3. 基本體系結(jié)構(gòu)
對于基于事件的 API, 其組織結(jié)構(gòu)是圍繞事件生成器(類分析器)、事件使用器(類寫入器)和各種預(yù)定義的事件篩選 器進行的,在這一結(jié)構(gòu)中可以添加用戶定義的生成器、使用器和篩選器。因此,這一 API 的使 用分為兩個步驟:
- 將事件生成器(ClassReader)、篩選器和使用器組件(各種XXXVisitor類及其子類)組裝為可能很復(fù)雜的體系結(jié)構(gòu),
- 然后啟動事件生成器,以執(zhí)行生成或轉(zhuǎn)換過程。
類似于 如下所示的復(fù)雜體系結(jié)構(gòu),其中的箭頭表示在類分析器、寫入器或轉(zhuǎn)換器之間進行的基于事件或 基于對象的通信,在整個鏈中的任何位置,都可能會在基于事件與基于對象的表示之間進行轉(zhuǎn)換:
4. 源碼以及包結(jié)構(gòu)
- 項目官網(wǎng)
https://asm.ow2.io/ - 源碼地址
https://gitlab.ow2.org/asm/asm - 包結(jié)構(gòu)
ASM庫主要由分布在若干個jar文件中的包構(gòu)成- org.objectweb.asm 和 org.objectweb.asm.signature 包提供了基于事件的API,并且提供了類解析和寫入組件,它們都包含在asm.jar中
- org.objectweb.asm.util 包,包含在asm-util.jar中,提供很多了基于核心API的工具,這些工具可以用來開發(fā)和調(diào)試ASM應(yīng)用
- org.objectweb.asm.commons 包,提供了一些有用的預(yù)定義的類轉(zhuǎn)換器,大部分是基于核心API
- the asm-tree.jar 中的org.objectweb.asm.tree package 包,提供了基于對象的API,并且,提供了“基于事件表示方式”和"基于對象表示方式"之間轉(zhuǎn)換的工具
- org.objectweb.asm.tree.analysis 包 提供了類分析框架,以及一些基于樹API的預(yù)定義好的類分析器,它們在asm-analysis.jar中
5. 相關(guān)文章(創(chuàng)作中)
1.核心API 之類處理
- Class文件結(jié)構(gòu)
- JVM內(nèi)部類型描述符,方法描述
- 類的轉(zhuǎn)換,一些官方工具
2. 核心API 之方法處理
前置知識
- JVM方法執(zhí)行模型
- 字節(jié)碼指令
方法處理
- 方法接口與組件
- 方法生成與轉(zhuǎn)換
- 一些方法工具
3. 核心API 之元數(shù)據(jù)處理
- 泛型
- 注解
4. 用ASM監(jiān)控方法執(zhí)行次數(shù)與時間
- 提供一些例子,用來實踐ASM
5. 從 JVM-SandBox看ASM框架實戰(zhàn)應(yīng)用
- JVM-Sandbox 簡介
- Attach 機制和插樁
- JVM-Sandbox 間諜類和AOP增強模型
- Sandbox 字節(jié)碼織入細節(jié)
- Sandbox 源碼剖析和事件處理流程分析