網(wǎng)頁(yè)設(shè)置如何優(yōu)化百度seo排名
字節(jié)碼技術(shù)應(yīng)用
字節(jié)碼技術(shù)的應(yīng)用場(chǎng)景包括但不限于AOP,動(dòng)態(tài)生成代碼,接下來(lái)講一下字節(jié)碼技術(shù)相關(guān)的第三方類庫(kù),第三方框架的講解是為了幫助大家了解字節(jié)碼技術(shù)的應(yīng)用方向,文檔并沒(méi)有對(duì)框架機(jī)制進(jìn)行詳細(xì)分析,有興趣的可以去了解相關(guān)框架實(shí)現(xiàn)原理和架構(gòu),也可以后續(xù)為大家奉上相關(guān)詳細(xì)講解。
ASM
ASM 是一個(gè) Java 字節(jié)碼操控框架,它能被用來(lái)動(dòng)態(tài)生成類或者增強(qiáng)既有類的功能。ASM 可以直接產(chǎn)生二進(jìn)制 class 文件,也可以在類被加載入 Java 虛擬機(jī)之前動(dòng)態(tài)改變類行為。
說(shuō)白了,ASM可以在不修改Java源碼文件的情況下,直接對(duì)Class文件進(jìn)行修改,改變或增強(qiáng)原有類功能。
在熟悉了字節(jié)碼原理的情況下,理解動(dòng)態(tài)修改字節(jié)碼技術(shù)會(huì)更加容易
接下來(lái)我們只針對(duì)ASM框架中幾個(gè)主要類進(jìn)行分析,并舉個(gè)栗子幫助大家理解。
主要類介紹
ClassVisitor
提供各種對(duì)字節(jié)碼操作的方法,包括對(duì)屬性、方法、注解等內(nèi)容的修改:
ClassWriter
主要功能就是記錄所有字節(jié)碼相關(guān)字段,并提供轉(zhuǎn)換為字節(jié)數(shù)組的方法:
ClassReader?Opcodes
ASM除了可以動(dòng)態(tài)生成新的Class文件,還可以修改原有Class文件的功能或者在原Class文件新增方法字段等,這里不再舉例子,有興趣的可以自己研究一下。不過(guò)大家已經(jīng)發(fā)現(xiàn),使用ASM動(dòng)態(tài)修改Class文件,難度還是有的,需要使用者對(duì)JVM指令、Class格式相當(dāng)熟悉,
除了ASM,還有其他第三方工具也提供了對(duì)字節(jié)碼的動(dòng)態(tài)修改,包括CGLib,Javassisit,AspectJ等,而這些框架相比于ASM,則是將JVM指令級(jí)別的編碼封裝起來(lái),讓使用者直接使用Java代碼編輯,使用更加方便。
引申
既然JVM運(yùn)行時(shí)識(shí)別的只是.class文件,而文件格式我們也了解,那是不是只要我們能夠正確生成.class文件就可以直接運(yùn)行,甚至可以不用Java語(yǔ)言?
答案大家肯定都知道了,當(dāng)然可以。Kotlin,Scala,Groovy,Jython,JRuby…這些都是基于JVM的編程語(yǔ)言。
那如果我們想自己實(shí)現(xiàn)一款基于JVM的開(kāi)發(fā)語(yǔ)言,怎么搞?
定義語(yǔ)義,靜態(tài),動(dòng)態(tài)?,強(qiáng)類型,弱類型?…
定義語(yǔ)法,關(guān)鍵字(if,else,break,return…)
定義代碼編譯器,如何將自己的代碼編譯成.class
知識(shí)來(lái)源:
【基礎(chǔ)】什么是字節(jié)碼,作用是什么_嗶哩嗶哩_bilibili
字節(jié)碼詳解_封何的博客-CSDN博客