成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Loaded代碼熱更新實踐和原理分析

開發 前端
Spring-loaded 使用 Java 的 Instrumentation API 在 JVM 啟動時指定 Agent,使它能夠在目標類加載之前進行攔截,并將目標類的字節碼通過 ASM 庫解析成抽象語法樹(AST),然后對 AST 進行修改。修改的內容包括增加、刪除、替換方法,修改方法體,添加字段等,最終替換目標類,改變其邏輯,實現對代碼的熱更新。

1、引言

開發者在編碼效率和快速迭代中的痛點場景包括:

1. 修改代碼后,需要頻繁重啟應用,導致開發效率低下;

2. 實時調試時,不能立即看到代碼修改的結果;

3. 大型項目中,重啟的時間成本較高。

針對這些問題,本文將深入探討如何利用Spring Loaded熱更新技術提高開發效率,減少編譯和重啟時間。分析Spring Loaded的熱更新原理,以及實際應用過程中所需的操作和注意事項。

2、框架簡介

Spring Loaded is a JVM agent for reloading class file changes whilst a JVM is running. It transforms classes at loadtime to make them amenable to later reloading. Unlike 'hot code replace' which only allows simple changes once a JVM is running (e.g. changes to method bodies), Spring Loaded allows you to add/modify/delete methods/fields/constructors. The annotations on types/methods/fields/constructors can also be modified and it is possible to add/remove/change values in enum types.

Spring Loaded 是一個 JVM 代理,可以在 JVM 運行時重新加載類文件的更改。它會在加載時轉換類,以便稍后重新加載。與“熱代碼替換”只允許在 JVM 運行時進行簡單更改(例如更改方法體)不同,Spring Loaded 允許您添加/修改/刪除方法/字段/構造函數。還可以修改類型/方法/字段/構造函數上的注解,并且可以添加/刪除/更改枚舉類型中的值。

3、如何使用

3.1 下載Agent插件

https://repo1.maven.org/maven2/org/springframework/springloaded/1.2.8.RELEASE/springloaded-1.2.8.RELEASE.jar

3.2 引入Agent插件

在jvm的啟動命令中添加以下參數

-javaagent:/Users/you/runtime/springloaded-1.2.8.RELEASE.jar -noverify

3.3 修改并重新編譯

修改代碼后執行Build->Recompile命令,可以看到在class reloaded完成后,程序的運行邏輯發生了變化

4、原理分析

4.1 代碼編譯分析

先來看一段源代碼,這是一個RpcService類,定義了target字段、targetStatic靜態字段和say方法,現在我們編譯它。

public class RpcService {
    private String target = "rpc";
    private static String targetStatic = "rpc static";
    public String say() {
        return "RpcService say hello SpringLoaded" + target;
    }
}

SpringLoaded對類編譯后添加了一些跟蹤記錄字段,添加方法攔截判斷。

public static ReloadableType r$type = TypeRegistry.getReloadableType(0, 1);

public transient ISMgr r$fields;

public static final SSMgr r$sfields;

public String hello() {
    if (r$type.changed(0) == 1) {
        return r$type.fetchLatest()).say(this);
    }
    String targetNew = TypeRegistry.instanceFieldInterceptionRequired(1, "target") ? (String)r$get(this, "target") : this.target;
    return "RpcService say hello SpringLoaded" + targetNew;
}

我們可以在代碼運行時,使用getDeclaredField、getDeclaredMethod等函數在運行時獲取類成員、方法信息,此時可以看到增強后的類多了如下字段和方法。

在編譯后的代碼中,我們可以看到RpcService類包含了一些新的字段和方法,這些都是Spring Loaded框架增加的。

?r$type是一個靜態變量,其類型為ReloadableType。這個字段用于表示當前類的可重載類型,它包含了當前類的最新字節碼和其他相關信息。

  • r$get、r$set方法是用于獲取實例字段的值的方法,處理字段的攔截和替換。
  • ___clinit___方法是用于執行類的靜態初始化塊的方法。
  • ___init___()方法是用于處理類的構造函數的方法。
  • 在say()方法中增加了一個代碼片段用于判斷類是否發生了變更,如果變更了,則調用最新的可重載類型中的say()方法獲取結果。否則,繼續執行原有的方法體。在方法體中,也增加了一個代碼片段用于判斷本地變量是否需要攔截,如果需要,則使用r$get()方法獲取非靜態變量traget的值,并用它替換原有的變量值。

4.2 運行過程分析

1、在應用程序啟動時,Spring Loaded在目標類路徑中查找所有的類,并在ClassPreProcessor中使用自定義類加載器加載這些類,重新定義后存入TypeRegistry,用于緩存、變更對比和依賴關系維護。

2、注冊一個文件變化監聽器FileChangeListener,當一個類文件被修改后,Spring Loaded會檢測到這個變化,并重新加載該類文件。

3、當一個類被重新加載時,Spring Loaded會嘗試對比類的簽名和繼承關系沒有改變,如果新的類定義與之前的類定義兼容,那么Spring Loaded會更新應用程序中的對象引用,以指向新的類定義。

5、總結

Spring-loaded 使用 Java 的 Instrumentation API 在 JVM 啟動時指定 Agent,使它能夠在目標類加載之前進行攔截,并將目標類的字節碼通過 ASM 庫解析成抽象語法樹(AST),然后對 AST 進行修改。修改的內容包括增加、刪除、替換方法,修改方法體,添加字段等,最終替換目標類,改變其邏輯,實現對代碼的熱更新。

6、擴展內容

  • Jrebel也可以實現類似熱更新功能,并且它更高效、穩定。jrebel官網
  • Spring-boot-devtools也可以提升開發速度,但是它的方案更像是熱重啟。Spring Boot Devtools Restarter 原理
  • 如何自己實現一個熱更新功能呢?思路大同小異,實現各有千秋。如何自己實現一個熱加載?如何定義自己的類加載器?

作者:京東零售 程嘯

來源:京東云開發者社區

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

2021-04-19 10:45:52

Webpack熱更新前端

2019-11-11 10:38:06

日志配置技術

2021-04-15 21:21:59

代碼熱Python函數

2019-10-14 17:00:14

前端代碼圈復雜度

2024-04-26 08:41:04

ViteHMR項目

2024-12-25 16:01:01

2024-04-11 11:04:05

Redis

2024-11-04 16:29:19

2009-07-24 13:54:39

MVVM模式

2016-10-28 10:40:12

2022-05-31 08:04:03

Redis高可用集群

2015-06-02 13:37:13

Node.jsWeb

2021-03-18 09:07:20

Nginx原理實踐

2021-04-12 09:09:52

物聯網設備物聯網IOT

2021-12-22 22:44:49

Webpack熱替換模塊

2017-03-09 18:51:53

2009-11-18 13:24:05

PHP單元素模式

2024-04-18 15:22:54

2021-08-03 08:35:36

Vuex數據熱更新

2017-05-17 08:51:39

WebView分析應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级片视频免费观看 | 国产精品国产a级 | 日韩av免费在线观看 | 亚洲一区二区三区在线 | 97伊人 | 99精品国产一区二区青青牛奶 | 中文字幕高清免费日韩视频在线 | 中文字幕一级毛片 | 特一级黄色毛片 | 玖操| www国产亚洲精品 | 天天色综网 | 国产精品视频不卡 | 欧美日韩久久久 | 色噜噜亚洲男人的天堂 | 凹凸日日摸日日碰夜夜 | 69精品久久久久久 | 精品国产不卡一区二区三区 | 欧美一区二 | 99久9| 久久国产精品免费一区二区三区 | 日韩久久久久久 | 亚洲国产精久久久久久久 | 亚洲国产成人av好男人在线观看 | .国产精品成人自产拍在线观看6 | 精品视频免费 | 国产一级一片免费播放 | 国产精品一区二区av | 国产福利在线视频 | 污片在线免费观看 | yiren22 亚洲综合 | 欧美日韩在线一区 | 国产午夜久久久 | 精品中文字幕一区二区 | 久久精品亚洲精品国产欧美 | 亚洲成人天堂 | 欧美日韩久久精品 | 综合久久网| 国产99久久 | 欧美成人精品一区二区三区 | 中文精品一区二区 |