日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring core源码解读之ASM4用户手册翻译之一asm简介

發(fā)布時間:2025/4/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring core源码解读之ASM4用户手册翻译之一asm简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第一章:ASM介紹

1.1 ASM動機:

程序的分析,生成,轉(zhuǎn)換技術(shù)可以應(yīng)用到許多場景:

1.程序分析,從簡單的語法解析到完整的語義分析,可以應(yīng)用在程序中找到潛在的bug,發(fā)現(xiàn)無用的代碼,工程代碼的逆向等等。

2.代碼生成應(yīng)用在各種編譯器中:既包括傳統(tǒng)的編譯器也包括分布式編程的stub或者skeleton編譯器,即時編譯器等等。

3. 代碼轉(zhuǎn)換,可用于優(yōu)化或混淆程序,向應(yīng)用中插入測試或性能監(jiān)控程序,面向切面編程等等。

這些技術(shù)可以用在任何編程語言,但或多或少容易依賴語言。在java 語言中,它們可以應(yīng)用在源碼中也可以應(yīng)用在編譯后的class文件中。用在編譯后的class文件中的好處之一是:顯然,不需要源代碼。代碼轉(zhuǎn)換可以應(yīng)用到任意的應(yīng)用,包括源碼封閉的應(yīng)用和商業(yè)應(yīng)用中。另外一個應(yīng)用到編譯后的代碼是:可以在運行時期(即在類被加載到j(luò)ava虛擬機之前)來分析,產(chǎn)生,轉(zhuǎn)換類。java虛擬機用來在運行時期產(chǎn)生、編譯源代碼,但它比較慢并且要求有一個完整的java編譯器。好處是:對用戶來說,這類工具例如stub編譯器或者切面編織器是透明的。

由于程序分析,產(chǎn)生和轉(zhuǎn)換技術(shù)有如此多種用途,很多種語言包含java的分析、生成和轉(zhuǎn)換的工具已經(jīng)被開發(fā)出來了。ASM就是一種專為java語言設(shè)計的在運行時期(不是離線)的類產(chǎn)生、轉(zhuǎn)換的工具。因此ASM庫專為編譯后的java類文件。它設(shè)計的盡可能的運行快,占用空間少。盡可能的快是為了盡可能不影響在運行期使用ASM應(yīng)用的速度;盡可能的小是為了用在內(nèi)存資源受到嚴格限制的環(huán)境避免因為使用ASM而造成小應(yīng)用或者庫的空間膨脹。

? ASM不僅僅是一個產(chǎn)生、轉(zhuǎn)換編譯后的java類的工具,它同時也是一種最現(xiàn)代最有效率的工具。可以從http://asm.objectweb.org下載到ASM. ASM的主要特點有以下幾點:

1. 它有一個簡單易用的、完美設(shè)計的、模塊化的API.

2. 它文檔完善并有一個Eclipse關(guān)聯(lián)的插件。

3. 它提供對java 最新版本java 7的支持。

4. 體積小,速度快,健壯性好。

5. 對新用戶提供龐大的社區(qū)支持。

6. 開源,允許你任意使用。

1.2 ASM 概述

1. 域

  ASM庫的目標是為了產(chǎn)生、轉(zhuǎn)換、分析編譯后的JAVA 類(表現(xiàn)為字節(jié)數(shù)組,因為它們存儲在磁盤上然后被加載到j(luò)ava 虛擬機中)。正因為有此目標,ASM提供了對這些字節(jié)數(shù)組讀寫和轉(zhuǎn)換的工具,這些工具使用比字節(jié)更高級別的抽象如數(shù)字常量,字符串,java標識符,java 類型,java類結(jié)構(gòu)元素等進行讀寫和轉(zhuǎn)換。注意:ASM庫的域被嚴格限定在對類的讀寫,轉(zhuǎn)換和分析。特別是類的加載時超過這個域的。

2. 模型

? ? ?ASM庫提供兩種類型的API來產(chǎn)生,轉(zhuǎn)換編譯后的類:核心API提供基于事件的類的展現(xiàn);樹API提供了一個基于對象的展現(xiàn)。

? ? 基于事件的模型中,一個類表現(xiàn)為一個事件序列,每個時間代表了類的一個元素,例如header、field、method聲明、一條指令等。基于事件的API定義了的一組可能事件和必須發(fā)生的順序,并提供了一個類解析器:它根據(jù)它解析的每一個元素產(chǎn)生一個事件;一個寫入器:從事件序列中產(chǎn)生編譯后的類。

? ?基于對象的模型中,一個類表現(xiàn)為一個對象樹,每個對象代碼了類的一部分,例如:類本身,一個field,一個方法,一條指令等。每個對象具有代表其組成的對象引用。基于對象的API提供了將代表一個類的事件序列轉(zhuǎn)換成代表同一個類的對象樹的方法,反之亦然,將一個對象樹轉(zhuǎn)換為等同的事件序列。換句話說,基于對象的API 建立在基于事件的API之上。這個兩個API的對比可以形容為:SAX(xml簡單api)和DOM(文檔對象模型),其中基于事件的API類似于SAX,基于對象的API類似于DOM。基于對象的API建立在基于事件的API之上,正如DOM建立在SAX上一樣。

ASM提供了這兩種API,因為沒有一種API 能比另外一種API更好。事實上,每個API都有自己的優(yōu)缺點:

1、基于事件的API比基于對象的API的速度更快,需要的空間更少。因為不需要再內(nèi)存中創(chuàng)建和存儲一個代表類的對象樹(同樣的情況也存在于SAX和DOM之間)。

2、 基于事件的API更難于實現(xiàn)類的轉(zhuǎn)換,因為在任意時間只能訪問到類的一個元素(對應(yīng)當前時間的元素),而基于對象的API都可以在內(nèi)存中訪問到。

注意:兩種API只能在一個事件管理一個類,并且各自獨立。類的繼承信息沒有保存,若一個類的轉(zhuǎn)換影響到別的類,必須由用戶去修改那些類。

3. 架構(gòu):

? ?ASM 應(yīng)用有很強的架構(gòu)視圖。事實上,基于事件的API圍繞事件生成者(類解析器)、事件消費者(類寫入器)和各種預(yù)定義的過濾器進行組織,用戶定義的生產(chǎn)者、消費者和各種過濾器可以很容易添加上去。因而使用此API需要兩步:

1、將事件的生產(chǎn)者、過濾器、消費者組件匯編成復(fù)雜的架構(gòu)。

2、然后運行事件生產(chǎn)者來運行產(chǎn)生或者轉(zhuǎn)換進程。

?基于對象的API同樣有一個架構(gòu)視圖:由操作對象樹的類產(chǎn)生器和轉(zhuǎn)換器組件構(gòu)成,兩者的連接表示轉(zhuǎn)換的順序。

盡管大部分組件架構(gòu)特別是ASM應(yīng)用是非常簡單的,但也能夠聯(lián)想到復(fù)雜的架構(gòu),如下:

箭頭代表類解析器、寫入器、轉(zhuǎn)換器之間基于事件或者基于對象的連接,在鏈型結(jié)構(gòu)中到處存在基于事件或者對象的轉(zhuǎn)換。

1.3 組織結(jié)構(gòu):

ASM庫有幾個不同的包組成,它們被放入到不同的jar文件中:

包org.objectweb.asm 和org.objectweb.asm.signature定義了基于事件的API,并且提供了類解析器和寫入器組件,它們被打入到asm.jar文件中。

包org.objectweb.asm.util,被打入到asm-util.jar文件中,提供了許多基于核心API的工具,這些工具可以用在ASM應(yīng)用的開發(fā)和調(diào)試當中。

包org.objectweb.asm.commons提供了一些有用的預(yù)定義類轉(zhuǎn)換器,大部分基于核心API。它被打包到asm-commons.jar。

包org.objectweb.asm.tree,打包到asm-tree.jar文件中,定義了基于對象的API,提供了基于事件和基于對象的表現(xiàn)形式的轉(zhuǎn)換工具。

包org.objectweb.asm.tree.analysis提供了基于樹API的一個類分析框架和一些類分析器,打包到asm-analysis.jar文件。

?該文檔包含兩個部分,第一部分介紹了核心API,例如:asm,asm-util和asm-commons文件。第二部分介紹了樹API,例如:asm-tree和asm-analysis文件。每部分至少有一章介紹關(guān)聯(lián)類的API,一章關(guān)聯(lián)方法的API,一章關(guān)聯(lián)注解、通用類型等的API。每章包含編程接口和相關(guān)工具及預(yù)定義組件。所有的實例源碼均可在ASM官方網(wǎng)站下載。

這種組織形式可以更容易地逐步引入類文件的各種特征,但有時需要在部分章節(jié)中擴展單個ASM類的表現(xiàn)形式因此,建議按照文檔的順序安排來讀取。如果僅使用該手冊文檔的ASM API,請使用Javadoc

?排版約定

  <略>

?致謝

  感謝Fran?ois Horn。在編纂這篇文檔期間,他的有價值的評論大大提高了該文檔的結(jié)構(gòu)和可讀性。

?

核心API、TREE API后續(xù)中。。。。

?

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/4230102.html

總結(jié)

以上是生活随笔為你收集整理的spring core源码解读之ASM4用户手册翻译之一asm简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。