ASM框架(一)初探

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 的使 用分為兩個步驟:

  1. 將事件生成器(ClassReader)、篩選器和使用器組件(各種XXXVisitor類及其子類)組裝為可能很復(fù)雜的體系結(jié)構(gòu),
  2. 然后啟動事件生成器,以執(zhí)行生成或轉(zhuǎn)換過程。

類似于 如下所示的復(fù)雜體系結(jié)構(gòu),其中的箭頭表示在類分析器、寫入器或轉(zhuǎn)換器之間進行的基于事件或 基于對象的通信,在整個鏈中的任何位置,都可能會在基于事件與基于對象的表示之間進行轉(zhuǎn)換:


image.png

4. 源碼以及包結(jié)構(gòu)

  • 項目官網(wǎng)
    https://asm.ow2.io/
  • 源碼地址
    https://gitlab.ow2.org/asm/asm
  • 包結(jié)構(gòu)
    ASM庫主要由分布在若干個jar文件中的包構(gòu)成
    1. org.objectweb.asm 和 org.objectweb.asm.signature 包提供了基于事件的API,并且提供了類解析和寫入組件,它們都包含在asm.jar中
    2. org.objectweb.asm.util 包,包含在asm-util.jar中,提供很多了基于核心API的工具,這些工具可以用來開發(fā)和調(diào)試ASM應(yīng)用
    3. org.objectweb.asm.commons 包,提供了一些有用的預(yù)定義的類轉(zhuǎn)換器,大部分是基于核心API
    4. the asm-tree.jar 中的org.objectweb.asm.tree package 包,提供了基于對象的API,并且,提供了“基于事件表示方式”和"基于對象表示方式"之間轉(zhuǎn)換的工具
    5. 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 源碼剖析和事件處理流程分析
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 前言 很早之前就寫過面向切面的編程思想,主要學(xué)習(xí)了AOP的思想(參考:AOP簡介)以及使用 AspectJ 實現(xiàn)簡...
    Whyn閱讀 10,876評論 4 40
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,423評論 0 9
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 15,987評論 2 11
  • 前面幾篇文章介紹了 .class 文件的結(jié)構(gòu)、JVM 如何加載 .class 文件、JVM 中如何執(zhí)行方法的調(diào)用和...
    lijiankun24閱讀 26,777評論 7 59
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    小邁克閱讀 3,034評論 1 3