日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

字節碼增強技術,不止有 Java Proxy、 Cglib 和 Javassist 還有 Byte Buddy

來源: 責編: 時間:2024-02-01 12:51:52 302觀看
導讀提到字節碼增強技術,相信用過 Spring 的小伙伴都會知道 Java Proxy 和 Cglib。畢竟面試準備的八股文中說過,Spring 的動態代理有兩種實現方式,在有接口存在的時候使用 Java Proxy,當沒有接口的時候使用的是 Cglib。這兩種

提到字節碼增強技術,相信用過 Spring 的小伙伴都會知道 Java Proxy 和 Cglib。krN28資訊網——每日最新資訊28at.com

畢竟面試準備的八股文中說過,Spring 的動態代理有兩種實現方式,在有接口存在的時候使用 Java Proxy,當沒有接口的時候使用的是 Cglib。krN28資訊網——每日最新資訊28at.com

這兩種方式的區別不在本文的討論范圍之內,今天想給大家介紹了是另一個字節碼增強技術 Byte Buddy。krN28資訊網——每日最新資訊28at.com

Byte Buddy

根據 Byte Buddy 官網所說,Byte Buddy 是一個代碼生成和操作庫,用于在 Java 應用程序運行時創建和修改 Java 類,而無需編譯器的幫助。krN28資訊網——每日最新資訊28at.com

Byte Buddy 提供一套簡單易用的 API,可以很方便的使用 Java 流式編程的形式來動態創建類或者創建接口的實現類,這一點跟 Java Proxy 和 Cglib 不一樣。krN28資訊網——每日最新資訊28at.com

使用 Byte Buddy 的方式也非常簡單,只要直接引入 Maven 依賴即可,沒有其他繁瑣的依賴。總的來說,使用 Byte Buddy 有下面的優勢:krN28資訊網——每日最新資訊28at.com

  1. 無需理解字節碼格式,簡單易用的 API 能很容易操作字節碼;
  2. 支持 Java 任何版本,庫輕量,僅取決于 Java 字節代碼解析器庫 ASM 的訪問者 API,它本身不需要任何其他依賴項。
  3. 比起 JDK 動態代理、cglib、Javassist,Byte Buddy 在性能上具有優勢。

圖片圖片krN28資訊網——每日最新資訊28at.com

這一份測試報告是官網提供的,表中的每一行分別為,類的創建、接口實現、方法調用、類型擴展、父類方法調用的性能結果。krN28資訊網——每日最新資訊28at.com

從性能報告中可以看出,Byte Buddy 在一些場景是有優勢的,但是在有些場景也不見得特別有優勢,不過整體來看還是不錯的。krN28資訊網——每日最新資訊28at.com

測試

說了那么多,下面給大家演示一下,如果使用 Byte Buddy,首先我們需要引入 Maven 依賴,我這里用的版本是 1.14.6,也可以使用其他版本。krN28資訊網——每日最新資訊28at.com

<dependency>    <groupId>net.bytebuddy</groupId>    <artifactId>byte-buddy</artifactId>    <version>1.14.6</version></dependency>

創建一個類,并覆蓋 toString

public static void test1() {        try {            Class<?> dynamicType = new ByteBuddy().                    subclass(Object.class)                    .method(ElementMatchers.named("toString"))                    .intercept(FixedValue.value("Hello World!"))                    .make()                    .load(ByteBuddyDemo.class.getClassLoader())                    .getLoaded();            System.out.println(dynamicType.newInstance().toString());        } catch (Exception e) {            System.out.println(e.getMessage());        }    }public static void test2() {        try {            DynamicType.Unloaded<Object> unloaded = new ByteBuddy()                    .subclass(Object.class)                    .method(ElementMatchers.named("toString"))                    .intercept(FixedValue.value("Hello World!"))                    .make();            DynamicType.Loaded<Object> load = unloaded.load(ByteBuddyDemo.class.getClassLoader());            System.out.println(load.getLoaded().newInstance().toString());        } catch (Exception e) {            throw new RuntimeException(e);        }    }

整個代碼的思路是通過 Byte Buddy,構造出一個 Class 對象,然后調用 Class 對象的 newInstance() 方法,再執行 toString() 方法。上面兩個方式的功能是一樣的,寫出來更方便大家理解。krN28資訊網——每日最新資訊28at.com

其中各個方法的含義如下:krN28資訊網——每日最新資訊28at.com

subClass:表示構造的類是 Object 的子類;krN28資訊網——每日最新資訊28at.com

method:表示要構造的具體方法,類似于過濾的功能;krN28資訊網——每日最新資訊28at.com

intercept:表示對過濾后的方法進行攔截;krN28資訊網——每日最新資訊28at.com

FixedValue.value("Hello World!"):表示構造返回一個”Hello World!“ 字符串;krN28資訊網——每日最新資訊28at.com

make:創建 DynamicType.Unloaded 對象,此時這個對象被構造出來,但是還沒有被 JVM 加載,還不能使用;krN28資訊網——每日最新資訊28at.com

load,getLoaded:加載當前類的構造器,并進行加載;krN28資訊網——每日最新資訊28at.com

等到加載到 JVM 過后,就可以使用 newInstance().toString() 進行調用了。krN28資訊網——每日最新資訊28at.com

代理方法

上面的例子是創建一個簡單的類和方法,下面我們介紹一個代理方法的使用,這里我們有一個目標類 Target 和一個方法 saySomething() 方法,有一個代理類 Agent,里面有一個代理方法 agentSaySomething(),如下所示:krN28資訊網——每日最新資訊28at.com

public class Target {    public String saySomething() {        return "Hello target";    }}public class Agent {    public static String agentSaySomething() {        System.out.println("agentSaySomething");        return "hello agent";    }}public static void test4() {        try {            DynamicType.Unloaded<Target> agent = new ByteBuddy()                    .subclass(Target.class)                    .method(named("saySomething")                            .and(isDeclaredBy(Target.class)                                    .and(returns(String.class))))                    .intercept(MethodDelegation.to(Agent.class))                    .make();            // 將 agent 字節碼寫入文件中            outputClazz(agent.getBytes());        } catch (Exception e) {            throw new RuntimeException(e);        }    }    private static void outputClazz(byte[] bytes) {        FileOutputStream out = null;        try {            String pathName = ByteBuddyDemo.class.getResource("/").getPath() + "AgentTarget.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();            }        }    }   public static void main(String[] args) {        test4();    }

運行過后我們可以看到生成了一個 class 文件,通過查看代碼如下,可以看到是創建了一個 Target 的子類,并且調用了 Agent 的 agentSaySomething 方法。krN28資訊網——每日最新資訊28at.com

圖片圖片krN28資訊網——每日最新資訊28at.com

總結

Byte Buddy的 API 很豐富,這里只是很簡單的給大家使用了幾個 API,還有包括方法,字段的設定等等,感興趣的小伙伴可以繼續去學習學習。krN28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-70468-0.html字節碼增強技術,不止有 Java Proxy、 Cglib 和 Javassist 還有 Byte Buddy

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Spring Boot項目集成RabbitMQ實戰以及坑點講解

下一篇: Java的ConcurrentHashMap是使用的分段鎖?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国内精品美女av在线播放| 久久精品99国产精品日本 | 欧美日韩国产在线| 欧美天天综合网| 国产日韩精品一区二区三区在线| 激情亚洲网站| 中文在线不卡| 久热精品在线视频| 国产精品国产三级国产专播品爱网| 亚洲日本乱码在线观看| 99视频超级精品| 黄色日韩精品| 久久精品免费播放| 国语自产在线不卡| 久久激情婷婷| 一区在线播放视频| 欧美成人四级电影| 亚洲黄网站在线观看| 久久婷婷激情| 亚洲区一区二| 久久国产精品电影| 欧美日韩免费观看一区| 国产精品乱子乱xxxx| 欧美日韩在线不卡| 欧美日韩美女在线观看| 国产精品啊啊啊| 亚洲第一中文字幕在线观看| 中文av字幕一区| 欧美成人综合| 国产色爱av资源综合区| 亚洲三级色网| 久久精品国产91精品亚洲| 欧美国产极速在线| 国内精品美女在线观看| 国产亚洲一级| 亚洲国产成人不卡| 欧美一区二区三区视频在线观看| 欧美色精品在线视频| 亚洲一区二区精品视频| 亚洲国产99| 韩国一区二区三区美女美女秀| 亚洲看片一区| 久久综合网络一区二区| 国产日韩欧美电影在线观看| 99精品欧美一区二区三区| 狂野欧美激情性xxxx| 国产精品一区二区女厕厕| 亚洲欧洲一级| 欧美jizzhd精品欧美巨大免费| 国产精品国产一区二区| 女主播福利一区| 亚洲福利视频在线| 久久久综合网站| 国产日韩专区| 欧美一区二视频在线免费观看| 国产精品嫩草影院一区二区| 日韩一级精品| 欧美另类久久久品| 日韩午夜激情av| 嫩草伊人久久精品少妇av杨幂| 国模大胆一区二区三区| 久久国产精品黑丝| 国产亚洲欧美在线| 久久久久久9| 久久福利毛片| 国产丝袜一区二区| 久久久久国产一区二区三区| 国产一区二区三区最好精华液| 久久久99爱| 亚洲欧洲一二三| 欧美日韩精品免费观看视一区二区| 一本久道久久综合婷婷鲸鱼| 国产精品免费在线 | 欧美天堂亚洲电影院在线播放| 亚洲免费黄色| 欧美午夜激情在线| 性感少妇一区| 精品88久久久久88久久久| 欧美国产日韩二区| 亚洲一区不卡| 一区视频在线| 国产精品久久久久久模特| 欧美在线你懂的| 亚洲精品极品| 欧美视频不卡| 免费日韩av片| 这里只有精品在线播放| 国产一区二区三区自拍| 欧美激情一区二区三区| 欧美在线|欧美| 亚洲神马久久| 91久久久精品| 国产免费成人| 欧美日韩亚洲激情| 免播放器亚洲| 久久电影一区| 亚洲午夜激情在线| 亚洲欧洲综合另类| 国产日韩欧美中文| 欧美午夜精品久久久| 蜜臀a∨国产成人精品| 亚洲图片欧美一区| 亚洲精品黄网在线观看| 国产日韩久久| 国产精品夜夜嗨| 欧美日韩在线第一页| 欧美风情在线观看| 蜜桃精品久久久久久久免费影院| 亚洲欧美日韩国产一区二区| 日韩视频一区二区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产精品国产自产拍高清av| 美女主播一区| 久久婷婷国产综合精品青草| 欧美一区二区视频在线观看2020 | 在线看片一区| 激情综合色丁香一区二区| 国产嫩草影院久久久久| 国产精品久久久久秋霞鲁丝| 欧美视频一区二区三区| 国产精品久久久久久久一区探花 | 欧美与欧洲交xxxx免费观看| 亚洲一区二区在线观看视频| 亚洲一区二区三| 亚洲综合另类| 欧美中文在线字幕| 麻豆精品一区二区av白丝在线| 蜜桃久久av一区| 欧美大片91| 欧美日韩一区高清| 国产精品久久久一区麻豆最新章节 | 亚洲色图综合久久| 亚洲欧美日韩成人| 久久久不卡网国产精品一区| 欧美中文在线观看| 欧美激情综合亚洲一二区 | 午夜亚洲福利在线老司机| 久久精品女人| 欧美精品成人在线| 国产精品欧美日韩一区二区| 国产亚洲亚洲| 99精品久久| 欧美在线观看一区| 欧美国产综合视频| 国产精品日日摸夜夜摸av| 狠狠色综合播放一区二区| 亚洲欧洲美洲综合色网| 亚洲一区在线免费观看| 久久精品视频网| 国产精品久久7| 一色屋精品视频在线看| 一区二区日韩精品| 久久综合国产精品| 欧美日韩午夜在线视频| 激情综合色综合久久| 一区二区免费看| 久久精品中文字幕一区二区三区| 欧美a级片网站| 国产一区二区丝袜高跟鞋图片| 亚洲欧洲一二三| 久久久水蜜桃| 国产精品男gay被猛男狂揉视频| 狠狠综合久久av一区二区老牛| 亚洲午夜精品久久久久久浪潮 | 欧美激情视频给我| 亚洲精品日韩一| 欧美韩日一区二区三区| 亚洲欧洲精品一区二区三区波多野1战4| 久久精品二区| 国产午夜精品一区二区三区视频 | 91久久国产自产拍夜夜嗨| 久久精品免费观看| 国内自拍一区| 另类天堂av| 亚洲激情自拍| 欧美日韩国产片| 一本色道久久综合亚洲精品婷婷| 欧美激情性爽国产精品17p| 亚洲高清免费| 欧美日本成人| 亚洲免费网站| 伊人久久大香线蕉av超碰演员| 麻豆精品视频在线观看| 亚洲三级免费观看| 欧美性事免费在线观看| 新片速递亚洲合集欧美合集| 一区二区在线看| 欧美日一区二区在线观看 | 久久综合九色综合欧美就去吻| 国户精品久久久久久久久久久不卡| 久久九九热免费视频| 亚洲高清自拍| 国产精品男女猛烈高潮激情| 欧美一区二区三区免费观看视频| 黄色一区二区在线| 欧美性猛片xxxx免费看久爱| 裸体一区二区| 亚洲欧美视频一区二区三区| 在线成人小视频| 国产麻豆一精品一av一免费| 欧美交受高潮1| 久久青草久久| 午夜亚洲一区| 一本久久知道综合久久|