精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個更簡單的字節碼增強框架,誰看了案例都會使用!

開發 架構
Byte Buddy 是一個代碼生成和操作庫,用于在 Java 應用程序運行時創建和修改 Java 類,而無需編譯器的幫助。除了 Java 類庫附帶的代碼生成實用程序外,Byte Buddy 還允許創建任意類,并且不限于實現用于創建運行時代理的接口。

一、前言

相對于小傅哥之前編寫的字節碼編程; ASM、Javassist 系列,Byte Buddy 玩法上更加高級,你可以完全不需要了解一個類和方法塊是如何通過 指令碼 LDC、LOAD、STORE、IRETURN... 生成出來的。就像它的官網介紹;

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

  • 無需理解字節碼指令,即可使用簡單的 API 就能很容易操作字節碼,控制類和方法。
  • 已支持Java 11,庫輕量,僅取決于Java字節代碼解析器庫ASM的訪問者API,它本身不需要任何其他依賴項。
  • 比起JDK動態代理、cglib、Javassist,Byte Buddy在性能上具有一定的優勢。

2015年10月,Byte Buddy被 Oracle 授予了 Duke's Choice大獎。該獎項對Byte Buddy的“ Java技術方面的巨大創新 ”表示贊賞。我們為獲得此獎項感到非常榮幸,并感謝所有幫助Byte Buddy取得成功的用戶以及其他所有人。我們真的很感激!

除了這些簡單的介紹外,還可以通過官網:https://bytebuddy.net,去了解更多關于 Byte Buddy 的內容。

好!那么接下來,我們開始從 HelloWorld 開始。深入了解一個技能前,先多多運行,這樣總歸能讓找到學習的快樂。

二、開發環境

  1. JDK 1.8.0
  2. byte-buddy 1.10.9
  3. byte-buddy-agent 1.10.9
  4. 本章涉及源碼在:itstack-demo-bytecode-2-01,可以關注公眾號:bugstack蟲洞棧,回復源碼下載獲取。你會獲得一個下載鏈接列表,打開后里面的第17個「因為我有好多開源代碼」,記得給個Star!

三、案例目標

每一個程序員,都運行過 N 多個 HelloWorld,就像很熟悉的 Java;

public class Hi {

public static void main(String[] args) {
System.out.println("Byte-buddy Hi HelloWorld By 小傅哥(bugstack.cn)");
}

}

那么我們接下來就通過使用動態字節碼生成的方式,來創建出可以輸出 HelloWorld 的程序。

新知識點的學習不要慌,最主要是找到一個可以入手的點,通過這樣的一個點去慢慢解開整個程序的面紗。

四、技術實現

1. 官網經典例子

在我們看官網文檔中,從它的介紹了就已經提供了一個非常簡單的例子,用于輸出 HelloWorld,我們在這展示并講解下。

案例代碼:

String helloWorld = new ByteBuddy()
.subclass(Object.class)
.method(named("toString"))
.intercept(FixedValue.value("Hello World!"))
.make()
.load(getClass().getClassLoader())
.getLoaded()
.newInstance()
.toString();

System.out.println(helloWorld); // Hello World!

他的運行結果就是一行,Hello World!,整個代碼塊核心功能就是通過 method(named("toString")),找到 toString 方法,再通過攔截 intercept,設定此方法的返回值。FixedValue.value("Hello World!")。到這里其實一個基本的方法就通過 Byte-buddy ,改造完成。

接下來的這一段主要是用于加載生成后的 Class 和執行,以及調用方法 toString()。也就是最終我們輸出了想要的結果。那么,如果你不能看到這樣一段方法塊,把我們的代碼改造后的樣子,心里還是有點虛。那么,我們通過字節碼輸出到文件,看下具體被改造后的樣子,如下;

編譯后的Class文件,ByteBuddyHelloWorld.class

public class HelloWorld {
public String toString() {
return "Hello World!";
}

public HelloWorld() {
}
}

在官網來看,這是一個非常簡單并且能體現 Byte buddy 的例子。但是與我們平時想創建出來的 main 方法相比,還是有些差異。那么接下來,我們嘗試使用字節碼編程技術創建出這樣一個方法。

2. 字節碼創建類和方法

接下來的例子會通過一點點的增加代碼梳理,不斷的把一個方法完整的創建出來。

2.1 定義輸出字節碼方法

為了可以更加清晰的看到每一步對字節碼編程后,所創建出來的方法樣子(clazz),我們需要輸出字節碼生成 clazz。在Byte buddy中默認提供了一個 dynamicType.saveIn() 方法,我們暫時先不使用,而是通過字節碼進行保存。

private static void outputClazz(byte[] bytes) {
FileOutputStream out = null;
try {
String pathName = ApiTest.class.getResource("/").getPath() + "ByteBuddyHelloWorld.class";
out = new FileOutputStream(new File(pathName));
System.out.println("類輸出路徑:" + pathName);
out.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != out) try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
  • 這個方法我們在之前也用到過,主要就是一個 Java 基礎的內容,輸出字節碼到文件中。

2.2 創建類信息

DynamicType.Unloaded<?> dynamicType = new ByteBuddy()
.subclass(Object.class)
.name("org.itstack.demo.bytebuddy.HelloWorld")
.make();

// 輸出類字節碼
outputClazz(dynamicType.getBytes());
  • 創建類和定義類名,如果不寫類名會自動生成要給類名。

此時class文件:

public class HelloWorld {
public HelloWorld() {
}
}

2.3 創建main方法

DynamicType.Unloaded<?> dynamicType = new ByteBuddy()
.subclass(Object.class)
.name("org.itstack.demo.bytebuddy.HelloWorld")
.defineMethod("main", void.class, Modifier.PUBLIC + Modifier.STATIC)
.withParameter(String[].class, "args")
.intercept(FixedValue.value("Hello World!"))
.make();

與上面相比新增的代碼片段;

  • defineMethod("main", void.class, Modifier.PUBLIC + Modifier.STATIC),定義方法;名稱、返回類型、屬性public static
  • withParameter(String[].class, "args"),定義參數;參數類型、參數名稱
  • intercept(FixedValue.value("Hello World!")),攔截設置返回值,但此時還能滿足我們的要求。

這里有一個知識點,Modifier.PUBLIC + Modifier.STATIC,這是一個是二進制相加,每一個類型都在二進制中占有一位。例如 1 2 4 8 ... 對應的二進制占位 1111。所以可以執行相加運算,并又能保留原有單元的屬性。

此時class文件:

public class HelloWorld {
public static void main(String[] args) {
String var10000 = "Hello World!";
}

public HelloWorld() {
}
}

此時基本已經可以看到我們平常編寫的 Hello World 影子了,但還能輸出結果。

2.4 委托函數使用

為了能讓我們使用字節碼編程創建的方法去輸出一段 Hello World ,那么這里需要使用到委托。

DynamicType.Unloaded<?> dynamicType = new ByteBuddy()
.subclass(Object.class)
.name("org.itstack.demo.bytebuddy.HelloWorld")
.defineMethod("main", void.class, Modifier.PUBLIC + Modifier.STATIC)
.withParameter(String[].class, "args")
.intercept(MethodDelegation.to(Hi.class))
.make();
  • 整體來看變化并不大,只有 intercept(MethodDelegation.to(Hi.class)),使用了一段委托函數,真正去執行輸出的是另外的函數方法。 MethodDelegation,需要是 public 類被委托的方法與需要與原方法有著一樣的入參、出參、方法名,否則不能映射上

此時class文件:

public class HelloWorld {
public static void main(String[] args) {
Hi.main(var0);
}

public HelloWorld() {
}
}
  • 那么此時就可以輸出我們需要的內容了,Hi.main 是定義出來的委托函數。也就是一個 HelloWorld

五、測試結果

為了可以讓整個方法運行起來,我們需要添加字節碼加載和反射調用的代碼塊,如下;

// 加載類
Class<?> clazz = dynamicType.load(GenerateClazzMethod.class.getClassLoader())
.getLoaded();

// 反射調用
clazz.getMethod("main", String[].class).invoke(clazz.newInstance(), (Object) new String[1]);

運行結果

類輸出路徑:/User/xiaofuge/itstack/git/github.com/itstack-demo-bytecode/itstack-demo-bytecode-2-01/target/test-classes/ByteBuddyHelloWorld.class
helloWorld

Process finished with exit code 0

效果圖

Byte buddy HelloWorld 效果圖?

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-02-07 10:40:30

gRPC系統Mac

2021-07-26 10:14:38

Go語言工具

2020-09-29 15:08:47

Go UI框架開發

2017-06-08 15:53:38

PythonWeb框架

2015-01-14 13:07:03

2016-09-14 17:48:44

2022-10-31 07:09:15

拷貝代碼項目

2023-01-01 14:04:51

字節碼接口系統

2016-03-23 11:02:06

2021-02-20 09:45:02

RPC框架Java

2016-11-29 13:31:52

JavaScriptsetTimeout定時執行

2023-09-11 19:53:50

2019-11-13 15:14:31

MySQL事務數據庫

2009-09-23 10:14:22

Hibernate

2011-03-24 09:34:41

SPRING

2023-08-11 08:39:36

工具AI

2024-07-26 00:00:20

2019-01-28 08:35:42

DevOpsGitGitLab

2023-10-26 00:30:00

Excel開源框架

2009-07-14 16:02:42

JDBC例子
點贊
收藏

51CTO技術棧公眾號

国产一二在线观看| 欧美国产日韩综合| 在线播放成人| 亚洲图片有声小说| 日本视频一区在线观看| 国产欧美综合视频| 亚洲欧美日韩国产综合精品二区| 中文字幕亚洲欧美日韩在线不卡 | 欧美一区二区三区视频免费播放 | 中文字幕观看av| 精品国产午夜肉伦伦影院| 欧美日韩三级视频| 国产精品333| av免费在线观看网址| 久久久久久免费毛片精品| 亚洲最大av在线| 小泽玛利亚一区二区三区视频| 国产精品第十页| 久久精品男人天堂| 实拍女处破www免费看| 亚洲国产精品免费视频| 在线观看欧美日本| 久久亚洲中文字幕无码| 国产一二三区在线观看| 国产亚洲精品精华液| 国产精品久久7| 国产精品亚洲欧美在线播放| 日韩影院免费视频| 97国产一区二区精品久久呦| 国产女人被狂躁到高潮小说| 四季av一区二区三区免费观看| 日韩国产精品视频| 色悠悠在线视频| 欧美午夜网站| 欧美一级国产精品| 国产三级生活片| 福利一区二区三区视频在线观看| 色国产综合视频| www国产黄色| 国模精品视频| 激情亚洲一区二区三区四区 | 91麻豆精品国产91久久久久久| 成人3d动漫一区二区三区| a'aaa级片在线观看| 亚洲综合成人网| 国产免费内射又粗又爽密桃视频| 看黄网站在线| 日韩美女久久久| 强伦女教师2:伦理在线观看| 麻豆视频在线免费观看| 自拍偷自拍亚洲精品播放| 亚洲一区精品视频| 成人在线直播| 亚洲激情一二三区| 97中文字幕在线| 黄网站在线观| 午夜私人影院久久久久| 久久久久久久久久久99| 超碰一区二区| 欧美中文字幕一区| 欧美伦理片在线观看| 黄色日韩网站| 欧美一卡二卡三卡| 一级黄色电影片| 久久99精品国产自在现线| 亚洲免费福利视频| 韩国三级hd中文字幕| 日韩欧美1区| 久久成人在线视频| 久久视频免费在线观看| 亚洲精一区二区三区| 日本最新高清不卡中文字幕| 少妇又紧又色又爽又刺激视频| 久久99精品久久只有精品| 91在线精品播放| 欧美一区二区在线观看视频| 久久日一线二线三线suv| 亚洲国产日韩美| 色在线视频网| 色综合天天综合网天天看片| 九九精品久久久| 911亚洲精品| 亚洲无限av看| 91精品国产高清一区二区三蜜臀| 国产欧美高清| 国产原创欧美精品| 黄色一级大片在线免费看国产| 久久一区二区三区四区| 强伦女教师2:伦理在线观看| 激情国产在线| 欧美日韩另类国产亚洲欧美一级| 97人妻精品一区二区三区免费| 九九视频精品全部免费播放| 精品国产一区二区三区久久狼5月| 九九热视频精品| 久久这里有精品15一区二区三区| 成人激情视频免费在线| 亚洲av成人无码网天堂| 国产精品久线观看视频| aa视频在线播放| 精品69视频一区二区三区| 亚洲电影在线观看| 91 在线视频| 乱码第一页成人| 成人av免费看| 在线免费看a| 欧美日韩中文字幕综合视频| 日本一二三区在线| 伊人久久大香线蕉无限次| 伦理中文字幕亚洲| 91在线视频免费播放| 国产大陆a不卡| 亚洲午夜激情| 欧美精品高清| 亚洲黄色在线观看| 免费一级全黄少妇性色生活片| 日韩av不卡一区二区| 国产日韩欧美亚洲一区| 成人黄色网址| 欧美色图天堂网| 一级片视频免费看| 国产精品久久久免费| 成人欧美一区二区三区在线观看| 免费大片黄在线观看视频网站| 色婷婷国产精品综合在线观看| 91九色蝌蚪porny| 欧美在线免费一级片| 国产精品免费在线免费| 精品视频二区| 91九色最新地址| 国产色视频一区二区三区qq号| 亚洲国产高清一区二区三区| 国产精品播放| 手机在线免费看av| 欧美一区二区三区日韩视频| 亚洲精品一区二区三区在线播放| 日韩电影免费在线观看网站| 欧美日韩一区二区三区在线观看免| 国产亚洲成av人片在线观看 | 污网站免费观看| 欧美日一区二区在线观看| 91免费福利视频| 巨大荫蒂视频欧美另类大| 欧美日韩激情一区二区| 自拍偷拍第9页| 久久99精品久久久久| 在线视频91| 综合久草视频| 九色精品美女在线| 午夜精品小视频| 亚洲一区二区三区在线| 性农村xxxxx小树林| 在线视频观看日韩| 久久视频在线观看中文字幕| 日本成人三级电影| 尤物九九久久国产精品的特点| 中文字幕在线播放不卡| 国产精品午夜在线| 在线观看中文av| 激情另类综合| 欧美精品欧美精品| 欧洲av一区二区| 精品国产一区av| 国产成人av免费看| 亚洲成人你懂的| 蜜桃精品一区二区| 看国产成人h片视频| 六月婷婷激情网| 韩国女主播一区二区三区| 91成人精品网站| 大乳在线免费观看| 欧美一级片在线看| 国产精品suv一区二区69| 久久色成人在线| www.亚洲自拍| 国产精品婷婷| 亚洲韩国在线| 一级毛片精品毛片| 欧美做爰性生交视频| 日本视频在线免费观看| 亚洲成人1234| 亚洲精品一区二区二区| 一区二区三区在线不卡| 国产精品无码一区二区三区| 激情综合网最新| 精品视频在线观看一区| 色狮一区二区三区四区视频| 国产精品一区二区三区精品| 欧美色网在线| 久久久久久久久网站| 成人在线免费观看| 欧美精品一区二区高清在线观看| 亚洲国产av一区二区三区| 亚洲免费观看高清完整| 精品无码人妻一区| 国产成人精品亚洲日本在线桃色| 黄色高清无遮挡| 欧美激情成人在线| 日韩三级电影| 国产精品qvod| 91在线观看免费观看| 日韩性xxx| 欧美精品久久一区二区| 视频一区二区三区不卡| 日韩成人av网| 亚洲精品字幕在线观看| 欧美日韩成人综合| 日韩不卡视频在线| 亚洲激情欧美激情| 日韩精品一区二区三区在线视频| 91视频国产资源| 午夜性福利视频| 久久成人麻豆午夜电影| 亚洲精品高清无码视频| 91久久在线| 天堂а√在线中文在线| 99久久九九| 色狠狠久久av五月综合| 日本在线中文字幕一区| 国产高清精品一区| 日韩欧美中文字幕一区二区三区| 国产精品亚洲自拍| 欧美大胆性生话| 国产69久久精品成人| 美足av综合网| 欧美另类高清videos| 麻豆传媒视频在线| 中文精品99久久国产香蕉| 青青青手机在线视频观看| 亚洲国产精品成人av| www.日韩高清| 欧美大片日本大片免费观看| 国产露脸国语对白在线| 91精品国产综合久久精品图片 | 日本一区二区三区视频在线观看| 免费萌白酱国产一区二区三区| 成人国产一区二区| 日韩三级网址| 成人免费在线看片| 日韩影片在线观看| 国产精品青青草| 黑人久久a级毛片免费观看| 国产精品免费一区二区三区四区 | 成人精品一区二区三区中文字幕| 激情小说欧美色图| 丰满放荡岳乱妇91ww| 在线xxxxx| 99精品欧美一区二区三区小说| 亚洲成av人片在线观看无| 不卡的av电影| 亚洲午夜福利在线观看| 久久久电影一区二区三区| 欧美图片第一页| 国产精品天干天干在观线| 欧美一区二区三区观看| 中文字幕一区二区三区av| 国产美女福利视频| 亚洲第一av色| 在线观看 亚洲| 欧美日韩国产精品成人| 亚洲国产中文字幕在线| 精品国产污网站| 免费在线高清av| 中文字幕国产亚洲| 91精品久久| 欧美中文在线视频| 国产成人精品一区二区三区免费| 91日本在线视频| 凹凸av导航大全精品| 精品视频一区在线| 日韩在线看片| 日韩精品一区二区免费| 久久一区二区三区四区五区 | 国产色一区二区| 欧美爱爱免费视频| 高跟丝袜欧美一区| 亚洲一卡二卡在线| 亚洲激情免费观看| 成人免费一区二区三区视频网站| 久久久精品亚洲| 蜜桃视频m3u8在线观看| 国产精品久久久久影院日本| 日本一区影院| 日韩hmxxxx| 欧美日韩国产高清| 激情五月亚洲色图| 国产成人aaa| 九九热免费在线| 亚洲高清免费视频| 一卡二卡在线观看| 精品亚洲精品福利线在观看| 毛片在线看网站| 97成人在线视频| 国产精品成人**免费视频| 欧美日韩高清在线一区| 欧美日韩1区| 在线观看免费不卡av| 91在线精品一区二区| 深夜福利影院在线观看| 在线精品视频一区二区| 理论片中文字幕| 久久久精品中文字幕| 国产精品专区免费| 国产成人免费观看| 91九色精品国产一区二区| 青青草原av在线播放| 国产成人aaa| 色偷偷www8888| 欧美在线三级电影| 无码精品在线观看| 欧美大片在线免费观看| 国产精品无码久久久久| 免费成人深夜夜行视频| 亚洲日本免费| 性猛交╳xxx乱大交| 《视频一区视频二区| 成人午夜精品视频| 亚洲精品一区二区久| 91色在线看| av成人午夜| 欧美日韩国产亚洲一区| 91网址在线观看精品| 中文字幕一区二区三区精华液| 一级久久久久久| 亚洲人成网站777色婷婷| 在线视频超级| 精品一区二区三区日本| 亚洲激情欧美| 超碰caoprom| 亚洲成av人综合在线观看| www.国产黄色| 欧美国产乱视频| 日韩黄色av| 激情成人开心网| 国产精品99久久久久久有的能看| 老司机精品免费视频| 欧美自拍偷拍一区| 91社区在线观看播放| 国产精品美女在线| 成人羞羞动漫| jizz欧美激情18| 国产精品久久久久久久浪潮网站 | 免费成人小视频| 人成免费在线视频| 欧美日韩国产乱码电影| 男人的天堂在线视频免费观看 | 国产精品毛片在线看| 国产精品无码专区| 欧美视频中文在线看| 久草视频在线看| 国产精品99久久久久久www | 久久九九亚洲综合| 爱情电影网av一区二区| 欧美大黑帍在线播放| 99视频国产精品| 伊人久久久久久久久久久久| 伊人伊成久久人综合网站| 青草综合视频| 日韩久久久久久久久久久久| 成人av在线一区二区| 久久精品国产成人av| 一区二区中文字幕| 91成人小视频| 成人黄色av片| 中文字幕乱码久久午夜不卡 | 日本少妇激情视频| 亚洲精品天天看| 国产黄色一区| 黄色一级大片免费| 2020日本不卡一区二区视频| 亚洲国产无线乱码在线观看 | 国产亚洲欧美久久久久| 亚洲精品综合久久中文字幕| 国产综合色激情| av在线com| 久久久久久久久97黄色工厂| 国产又粗又猛又黄又爽| 久久久久久久一区二区| 国产亚洲第一伦理第一区| www.偷拍.com| 日韩欧美精品免费在线| 久久国产精品一区| 精品国产乱码久久久久久郑州公司 | 国产精品视频你懂的| 性少妇videosexfreexxx片| 456国产精品| 91精品久久久久久久久久不卡| 国产一级黄色录像| 欧美精品在线观看播放| 鲁鲁在线中文| 中国一级黄色录像| 久久久久久久久久久电影| 亚洲国产成人在线观看| 国产精品第1页| 亚洲福利久久| 日韩国产第一页| 亚洲九九九在线观看| 综合激情久久| 97超碰人人爽| 91福利社在线观看|