ASM框架(一)初探

1. ASM簡(jiǎn)介

ASM是被設(shè)計(jì)用于運(yùn)行時(shí)的,離線的類(lèi)生成和轉(zhuǎn)換,作用于已編譯好的Java class,并且被設(shè)計(jì)的盡可能的小巧快速,其目的是生成、轉(zhuǎn)換和分析以字節(jié)數(shù)組表示的已編譯 Java 類(lèi)(它們?cè)诖疟P(pán)中的存儲(chǔ) 和在 Java 虛擬機(jī)中的加載都采用這種字節(jié)數(shù)組形式)。為此,ASM 提供了一些工具,使用高于字節(jié)級(jí)別的概念來(lái)讀寫(xiě)和轉(zhuǎn)換這種字節(jié)數(shù)組,這些概念包括數(shù)值常數(shù)、字符串、Java 標(biāo)識(shí)符、Java 類(lèi)型、Java 類(lèi)結(jié)構(gòu)元素,等等。注意,ASM 庫(kù)的范圍嚴(yán)格限制于類(lèi)的讀、寫(xiě)、轉(zhuǎn)換和分析。具體來(lái)說(shuō),類(lèi)的加載過(guò)程就超出了它的范圍之外。

2. 模型

ASM提供了兩種API模型,用來(lái)操作Class文件,一種是核心API,基于事件來(lái)表示類(lèi),另一種是樹(shù)API,以基于對(duì)象的形式表示類(lèi)?;趯?duì)象的 API 構(gòu)建在基于事件的 API 之上。這兩個(gè)API可以類(lèi)比于Java中兩種處理XML的框架,SAX和DOM,基于事件的類(lèi)似于SAX,基于對(duì)象的類(lèi)似于DOM。

基于事件的API,采用的設(shè)計(jì)模式中經(jīng)典的訪問(wèn)者模式,后續(xù)會(huì)主要介紹核心API,詳細(xì)描述這一部分基于事件的API的使用,這里做概括性的說(shuō)明,ASM在解析Class文件過(guò)程中,會(huì)把每個(gè)遇到的類(lèi)元素,如限定符,常量池,一個(gè)字段,一個(gè)方法,注解等等轉(zhuǎn)換一個(gè)一個(gè)事件,基于事件發(fā)生的順序來(lái)調(diào)用訪問(wèn)者類(lèi),并且還提供了一個(gè)類(lèi)寫(xiě)入器(特殊的訪問(wèn)者類(lèi)),由這些事件再次生成編譯后的類(lèi)。

對(duì)基于對(duì)象的API感興趣,可以通過(guò)官方文檔來(lái)學(xué)習(xí) asm4-guide.pdf。

本文的內(nèi)容也大多來(lái)自于翻譯官方文檔和官方例子

3. 基本體系結(jié)構(gòu)

對(duì)于基于事件的 API, 其組織結(jié)構(gòu)是圍繞事件生成器(類(lèi)分析器)、事件使用器(類(lèi)寫(xiě)入器)和各種預(yù)定義的事件篩選 器進(jìn)行的,在這一結(jié)構(gòu)中可以添加用戶定義的生成器、使用器和篩選器。因此,這一 API 的使 用分為兩個(gè)步驟:

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

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


image.png

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

  • 項(xiàng)目官網(wǎng)
    https://asm.ow2.io/
  • 源碼地址
    https://gitlab.ow2.org/asm/asm
  • 包結(jié)構(gòu)
    ASM庫(kù)主要由分布在若干個(gè)jar文件中的包構(gòu)成
    1. org.objectweb.asm 和 org.objectweb.asm.signature 包提供了基于事件的API,并且提供了類(lèi)解析和寫(xiě)入組件,它們都包含在asm.jar中
    2. org.objectweb.asm.util 包,包含在asm-util.jar中,提供很多了基于核心API的工具,這些工具可以用來(lái)開(kāi)發(fā)和調(diào)試ASM應(yīng)用
    3. org.objectweb.asm.commons 包,提供了一些有用的預(yù)定義的類(lèi)轉(zhuǎn)換器,大部分是基于核心API
    4. the asm-tree.jar 中的org.objectweb.asm.tree package 包,提供了基于對(duì)象的API,并且,提供了“基于事件表示方式”和"基于對(duì)象表示方式"之間轉(zhuǎn)換的工具
    5. org.objectweb.asm.tree.analysis 包 提供了類(lèi)分析框架,以及一些基于樹(shù)API的預(yù)定義好的類(lèi)分析器,它們?cè)赼sm-analysis.jar中

5. 相關(guān)文章(創(chuàng)作中)

1.核心API 之類(lèi)處理

  • Class文件結(jié)構(gòu)
  • JVM內(nèi)部類(lèi)型描述符,方法描述
  • 類(lèi)的轉(zhuǎn)換,一些官方工具

2. 核心API 之方法處理

前置知識(shí)
  • JVM方法執(zhí)行模型
  • 字節(jié)碼指令
方法處理
  • 方法接口與組件
  • 方法生成與轉(zhuǎn)換
  • 一些方法工具

3. 核心API 之元數(shù)據(jù)處理

  • 泛型
  • 注解

4. 用ASM監(jiān)控方法執(zhí)行次數(shù)與時(shí)間

  • 提供一些例子,用來(lái)實(shí)踐ASM

5. 從 JVM-SandBox看ASM框架實(shí)戰(zhàn)應(yīng)用

  • JVM-Sandbox 簡(jiǎn)介
  • Attach 機(jī)制和插樁
  • JVM-Sandbox 間諜類(lèi)和AOP增強(qiáng)模型
  • Sandbox 字節(jié)碼織入細(xì)節(jié)
  • Sandbox 源碼剖析和事件處理流程分析
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容