日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java字節碼增強技術知識點詳解

瀏覽:162日期:2023-02-09 14:25:33

簡單介紹下幾種java字節碼增強技術。

ASM

ASM是一個Java字節碼操控框架,它能被用來動態生成類或者增強既有類的功能。ASM可以直接產生class文件,也可以在類被加載入Java虛擬機之前動態改變類行為。ASM從類文件中讀入信息后,能夠改變類行為,分析類信息,甚至能夠根據用戶要求生成新類。

主頁:https://asm.ow2.io/index.html

ASM框架中的核心類有以下幾個:

① ClassReader:該類用來解析編譯過的class字節碼文件。

② ClassWriter:該類用來重新構建編譯后的類,比如說修改類名、屬性以及方法,甚至可以生成新的類的字節碼文件。

③ ClassAdapter:該類也實現了ClassVisitor接口,它將對它的方法調用委托給另一個ClassVisitor對象。

參考代碼:

import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import org.objectweb.asm.ClassWriter;import org.objectweb.asm.Opcodes;public class GeneratorClass { public static void main(String[] args) throws IOException {//生成一個類只需要ClassWriter組件即可ClassWriter cw = new ClassWriter(0);//通過visit方法確定類的頭部信息cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC+Opcodes.ACC_ABSTRACT+Opcodes.ACC_INTERFACE,'com/asm3/Comparable', null, 'java/lang/Object', new String[]{'com/asm3/Mesurable'});//定義類的屬性cw.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC,'LESS', 'I', null, new Integer(-1)).visitEnd();cw.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC,'EQUAL', 'I', null, new Integer(0)).visitEnd();cw.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC,'GREATER', 'I', null, new Integer(1)).visitEnd();//定義類的方法cw.visitMethod(Opcodes.ACC_PUBLIC+Opcodes.ACC_ABSTRACT, 'compareTo','(Ljava/lang/Object;)I', null, null).visitEnd();cw.visitEnd(); //使cw類已經完成//將cw轉換成字節數組寫到文件里面去byte[] data = cw.toByteArray();File file = new File('D://Comparable.class');FileOutputStream fout = new FileOutputStream(file);fout.write(data);fout.close(); }}Javassist

Javassist是一個開源的分析、編輯和創建Java字節碼的類庫。

它已加入了開放源代碼JBoss應用服務器項目,通過使用Javassist對字節碼操作為JBoss實現動態'AOP'框架。

主頁:http://www.javassist.org/

利用Javassist實現字節碼增強時,可以無須關注字節碼刻板的結構,其優點就在于編程簡單。直接使用java編碼的形式,而不需要了解虛擬機指令,就能動態改變類的結構或者動態生成類。其中最重要的是ClassPool、CtClass、CtMethod、CtField這四個類:

CtClass(compile-time class):編譯時類信息,它是一個class文件在代碼中的抽象表現形式,可以通過一個類的全限定名來獲取一個CtClass對象,用來表示這個類文件。

ClassPool:從開發視角來看,ClassPool是一張保存CtClass信息的HashTable,key為類名,value為類名對應的CtClass對象。當我們需要對某個類進行修改時,就是通過pool.getCtClass(“className”)方法從pool中獲取到相應的CtClass。

CtMethod、CtField:這兩個比較好理解,對應的是類中的方法和屬性。

參考代碼:

import javassist.*;public class CreatePerson { public static void createPseson() throws Exception {ClassPool pool = ClassPool.getDefault();// 1. 創建一個空類CtClass cc = pool.makeClass('com.test.javassist.Person');// 2. 新增一個字段 private String name;// 字段名為nameCtField param = new CtField(pool.get('java.lang.String'), 'name', cc);// 訪問級別是 privateparam.setModifiers(Modifier.PRIVATE);// 初始值是 'xiaoming'cc.addField(param, CtField.Initializer.constant('xiaoming'));// 3. 生成 getter、setter 方法cc.addMethod(CtNewMethod.setter('setName', param));cc.addMethod(CtNewMethod.getter('getName', param));// 4. 添加無參的構造函數CtConstructor cons = new CtConstructor(new CtClass[]{}, cc);cons.setBody('{name = 'xiaohong';}');cc.addConstructor(cons);// 5. 添加有參的構造函數cons = new CtConstructor(new CtClass[]{pool.get('java.lang.String')}, cc);// $0=this / $1,$2,$3... 代表方法參數cons.setBody('{$0.name = $1;}');cc.addConstructor(cons);// 6. 創建一個名為printName方法,無參數,無返回值,輸出name值CtMethod ctMethod = new CtMethod(CtClass.voidType, 'printName', new CtClass[]{}, cc);ctMethod.setModifiers(Modifier.PUBLIC);ctMethod.setBody('{System.out.println(name);}');cc.addMethod(ctMethod);//這里會將這個創建的類對象編譯為.class文件cc.writeFile('/Users/yangyue/workspace/springboot-learn/java-agent/src/main/java/'); } public static void main(String[] args) {try { createPseson();} catch (Exception e) { e.printStackTrace();} }}Byte Buddy

Byte Buddy是一個代碼生成和操作庫,用于在Java應用程序運行時創建和修改Java類,而無需編譯器的幫助。除了Java類庫附帶的代碼生成實用程序外,Byte Buddy還允許創建任意類,并且不限于實現用于創建運行時代理的接口。此外,Byte Buddy提供了一種方便的API,可以使用Java代理或在構建過程中手動更改類。

主頁:https://bytebuddy.net/

參考代碼:

Class<?> dynamicType = new ByteBuddy() .subclass(Object.class) .method(ElementMatchers.named('toString')) .intercept(FixedValue.value('Hello World!')) .make() .load(getClass().getClassLoader()) .getLoaded(); assertThat(dynamicType.newInstance().toString(), is('Hello World!'));JVM-SANDBOX

JVM沙箱容器,一種JVM的非侵入式運行期AOP解決方案:

動態增強類你所指定的類,獲取你想要的參數和行信息甚至改變方法執行。

動態可插拔容器框架。主頁:https://github.com/alibaba/jvm-sandbox

知識點擴充:

動態生成字節碼

我們知道,我們編寫的 Java 代碼都是要被編譯成字節碼后才能放到 JVM 里執行的,而字節碼一旦被加載到虛擬機中,就可以被解釋執行。

字節碼文件(.class)就是普通的二進制文件,它是通過 Java 編譯器生成的。而只要是文件就可以被改變,如果我們用特定的規則解析了原有的字節碼文件,對它進行修改或者干脆重新定義,這不就可以改變代碼行為了么。

Java 生態里有很多可以動態生成字節碼的技術,像 BCEL、Javassist、ASM、CGLib 等,它們各有自己的優勢。有的使用復雜卻功能強大、有的簡單確也性能些差。

ASM 框架

ASM 是它們中最強大的一個,使用它可以動態修改類、方法,甚至可以重新定義類,連 CGLib 底層都是用 ASM 實現的。

當然,它的使用門檻也很高,使用它需要對 Java 的字節碼文件有所了解,熟悉 JVM 的編譯指令。雖然我對 JVM 的字節碼語法不熟,但有大神開發了可以在 IDEA 里查看字節碼的插件:ASM Bytecode Outline,在要查看的類文件里右鍵選擇Show bytecode Outline即可以右側的工具欄查看我們要生成的字節碼。對照著示例,我們就可以很輕松地寫出操作字節碼的 Java 代碼了。

到此這篇關于Java字節碼增強技術知識點詳解的文章就介紹到這了,更多相關Java字節碼增強技術內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美精品99| 日韩精品午夜| 日韩午夜高潮| 欧美日韩国产一区二区三区不卡| caoporn视频在线| 国产精品13p| 亚洲精品一级二级| 妖精视频成人观看www| 亚洲精品高潮| 国产欧美日韩视频在线| 精品久久电影| 亚洲精品99| 日本精品在线播放| 色综合五月天| 男女男精品网站| 中文视频一区| 久久中文字幕一区二区| 久久国产中文字幕| 亚洲精品观看| 91亚洲国产成人久久精品| 欧美成人久久| 亚洲69av| 日韩一区二区三区免费播放| 自拍日韩欧美| 7m精品国产导航在线| 国产精品视频一区二区三区四蜜臂 | 中文日韩在线| 国产99久久| 高清久久精品| 亚洲综合色婷婷在线观看| 国产+成+人+亚洲欧洲在线| 蜜桃久久精品一区二区| 精品国产乱码久久久久久樱花| 亚洲欧美日韩精品一区二区| 成人高清一区| 日本午夜精品久久久久| 日韩在线观看不卡| 久久久久黄色| 亚洲人成在线影院| 国产精品成人国产| 欧美经典一区| 亚洲精一区二区三区| 欧美精品羞羞答答| 欧洲一级精品| 国产免费av一区二区三区| 性一交一乱一区二区洋洋av| 欧美日韩精品免费观看视完整| 欧美日韩国产一区二区在线观看| 亚洲深爱激情| 夜久久久久久| 国精品一区二区三区| 亚洲黄色免费看| 欧美男人天堂| 在线天堂资源www在线污| 韩日一区二区| 国产精区一区二区| 91精品国产自产观看在线| 美日韩精品视频| 日韩午夜精品| 美女精品在线观看| 日精品一区二区三区| 日韩一区二区三区四区五区| 麻豆9191精品国产| 日本不卡一二三区黄网| 欧美三级第一页| 国产精品亚洲综合在线观看| 国产精品久久久久久久久久妞妞| 国产精品亚洲欧美一级在线| 精品高清久久| 播放一区二区| 999久久久91| 国产农村妇女精品一二区| 亚洲综合不卡| 国产另类在线| 久久久久国产| 亚洲一二av| 精品视频高潮| 欧美亚洲国产激情| 亚洲精一区二区三区| 久久精品72免费观看| 97se综合| 日韩精品中文字幕吗一区二区| 国产精品三级| 不卡中文字幕| 日本不卡一二三区黄网| 欧美日韩中出| 蜜臀av免费一区二区三区| 青青草精品视频| 久久亚洲国产| 国产精品久久久久久久久免费高清| 日本在线精品| 日韩精品国产欧美| 99精品国产一区二区三区| 日韩激情啪啪| 午夜免费一区| 国产精品久久亚洲不卡| 激情欧美日韩一区| 三级在线看中文字幕完整版| 99精品视频在线| 亚洲精品一级| 欧美视频久久| 色婷婷精品视频| 欧美激情 亚洲a∨综合| 视频一区二区中文字幕| 中文一区一区三区高中清不卡免费| 国产亚洲一区在线| 午夜久久中文| 日本视频一区二区| 国产亚洲精品久久久久婷婷瑜伽| 视频在线不卡免费观看| 日韩av网站在线免费观看| 亚洲国内精品| 日韩精品欧美| 色一区二区三区| 老司机精品视频网| 综合一区av| 视频在线观看一区| 99国产精品视频免费观看一公开| 精品国产一区二区三区av片| 日本91福利区| 国产精品尤物| 久久精品一区二区国产| 久久福利在线| 成人在线视频中文字幕| 国产免费av一区二区三区| 欧美一级网址| 美女精品久久| 日韩成人精品一区| 久久人人99| 日韩久久精品网| 精品一区二区三区在线观看视频| 色综合视频一区二区三区日韩| 久久99伊人| 911亚洲精品| 精品国产一区二区三区av片| 成人午夜亚洲| 日韩欧美一区免费| 国产精品日韩| 丝袜诱惑制服诱惑色一区在线观看| 99视频精品全国免费| 国产精品嫩草99av在线| 日韩一区二区三区精品| 69精品国产久热在线观看| 欧美激情五月| 国内精品99| 视频在线在亚洲| 国产精区一区二区| 在线精品亚洲欧美日韩国产| 国产视频一区三区| 国产激情欧美| 国内亚洲精品| 国产亚洲久久| 蜜桃精品在线| 日韩三级久久| 日韩精品dvd| 日本精品一区二区三区在线观看视频| 国产福利一区二区精品秒拍| 美女网站视频一区| 91国内精品| 欧美美女一区| 日韩va亚洲va欧美va久久| 亚洲风情在线资源| **爰片久久毛片| 欧美日韩四区| 国产一区二区三区不卡视频网站 | 精品国产乱码| 在线看片福利| 日韩手机在线| 亚洲精品动态| 亚洲图片久久| 久久精品午夜| 国产日韩欧美中文在线| 麻豆精品视频在线观看免费| 999视频精品| 麻豆精品在线| 综合国产精品| 一区二区亚洲精品| 久久九九精品| 精品中国亚洲| 国产情侣久久| 精品一级视频| 国产剧情一区| 久久国产88| 亚洲一区二区免费在线观看| 午夜精品成人av| 亚洲黄页一区| 国产探花一区二区| 麻豆成人91精品二区三区| 欧美在线网站| av中文字幕在线观看第一页| 奇米色欧美一区二区三区| 日韩精品亚洲专区在线观看| 99视频精品全部免费在线视频| 欧美日韩一区二区三区不卡视频 | 国产精品s色| 国产欧美日韩一区二区三区在线| 红桃视频亚洲| 99精品美女| av一区在线| 欧美特黄一区|