最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

編譯期動態(tài)替換三方包中的Class文件過程詳解

 更新時間:2023年03月27日 16:19:44   作者:紅兔哥  
這篇文章主要為大家介紹了編譯期動態(tài)替換三方包中的Class文件過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

背景

最近做業(yè)務時遇到一個問題,客戶想在底層數(shù)據(jù)添加一個字段,只能乖乖的添加表字段、實體添加對應屬性,一切都在預期中進行這,但是這個工程是經(jīng)過二開的,展示層實體沒法直接添加,于是想當然繼承實體擴展字段,沒想到頂層一堆Request、Response,如果一個一個進行擴展馬也得累死,于是就思考有沒有簡便的方法僅對目標實體進行操作來完成字段添加的方法。

思考過程

在Java中要在類中添加字段屬性,除了顯示編碼外,還有一種技術(shù)就是編譯期間動態(tài)修改,比如Lombok、Mapstruct等都是在編譯期動態(tài)生成代碼,提高編碼效率,所以我也考慮通過這種方式編譯期添加目標字段屬性,百度了一通沒有合適的方式動態(tài)添加,但是手寫通過字節(jié)碼注入一定是可以實現(xiàn)的,想想成本還是有點高,趕緊轉(zhuǎn)換思路,既然不能動態(tài)插入字段,那能不能直接替換目標類呢?一想到這就有戲,在Java中加載類是通過類加載器進行加載的,有了依據(jù)后趕緊接著百度,果不然讓我發(fā)現(xiàn)一種方式,通過maven插件的方式實現(xiàn),客官接著往下看。

一般情況下不建議用這么hack的方式哈,盡量保持三方包的新鮮度,避免未來升級導致的兼容性問題。

主角出場

主角:maven-dependency-plugin

這僅僅是處理的一種方式,大家如果有更好的處理方式,可以放到評論區(qū),我們一起討論,互相學習進步。

實現(xiàn)原理

通過配置maven-dependency-plugin, 可以將我們指定的dependency解壓到項目的class目錄中,設置不覆蓋本地項目相同class文件(類的全限定名相同),就實現(xiàn)了本地文件替換三方jar中類文件的目的了。

在Java應用中,如果存在多個同名類,最終只會加載一個目標類,到底會加載哪個同名類是又類加載器的雙親委派機制決定的,先請求父類加載器加載,父類無法加載回到應用程序加載器,應用程序無法加載就會到類路徑下即class目錄中加載,如果仍然不存在會到依賴中進行加載。

基于以上原理,實現(xiàn)類文件覆蓋就有了依據(jù),那么接下來具體實踐演示下。

使用

這里我使用commons-lang3舉例。

第一步:配置Maven插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.1.2</version>
    <executions>
        <execution>
            <!-- unpack任務標識符,unpack是將依賴從倉庫中解壓到指定目錄 -->
            <id>unpack</id>
            <!-- unpack任務默認執(zhí)行階段 -->
            <phase>generate-sources</phase>
            <goals>
                <!-- 目標功能:unpack -->
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>org.apache.commons</groupId>
                        <artifactId>commons-lang3</artifactId>
                        <!-- 設置為false,依賴解壓到目錄時不會進行覆蓋,設置為true則會覆蓋 -->
                        <overWrite>false</overWrite>
                        <!-- 目標class文件輸出目錄 -->
                        <outputDirectory>${project.build.directory}/classes</outputDirectory>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

第二步:編譯工程

這一步還沒有定義目標類,暫時僅是將目標三方包的類放到了class目錄下,標紅的位置是即將要進行修改的位置。

第三步:添加目標類

  • 包名和目標類所在包名完全一致;
  • 類名保持一致;

第四步:重新編譯工程

至此已經(jīng)能夠看到效果了,整個方式過程也比較簡單,去掉中間的編譯過程,總共兩步。

總結(jié)

這種Hack的方式在業(yè)務編碼中建議少用,通過上邊的方式雖然能解決問題,但同時也引入了一些副作用,一方面相當于依賴包引入兩份,另一方面當依賴包升級時可能存在疏漏??纯磳W習學習,多一種解決方式多一條路,希望大家每天編碼順順利,我就先溜了!

以上就是編譯期動態(tài)替換三方包中的Class文件過程詳解的詳細內(nèi)容,更多關(guān)于編譯期動態(tài)替換Class文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java實現(xiàn)窗口刷新的示例代碼

    java實現(xiàn)窗口刷新的示例代碼

    本文主要介紹了java實現(xiàn)窗口刷新的示例代碼,通過重寫paintComponent()方法和調(diào)用repaint()方法,可以實現(xiàn)窗口的即時刷新,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Java8實現(xiàn)對List<Integer>的求和

    Java8實現(xiàn)對List<Integer>的求和

    這篇文章主要介紹了Java8實現(xiàn)對List<Integer>的求和方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java方法重載Overload原理及使用解析

    Java方法重載Overload原理及使用解析

    這篇文章主要介紹了Java方法重載Overload原理及使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • mac下修改idea的jvm運行參數(shù)解決idea卡頓的情況

    mac下修改idea的jvm運行參數(shù)解決idea卡頓的情況

    這篇文章主要介紹了mac下修改idea的jvm運行參數(shù)解決idea卡頓的情況,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • mybatis-plus中更新null值的問題解決

    mybatis-plus中更新null值的問題解決

    本文主要介紹 mybatis-plus 中常使用的 update 相關(guān)方法的區(qū)別,以及更新 null 的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-04-04
  • SpringBoot整合Swagger2的步驟詳解

    SpringBoot整合Swagger2的步驟詳解

    這篇文章主要介紹了SpringBoot整合Swagger2的步驟詳解,幫助大家更好的理解和學習使用SpringBoot框架,感興趣的朋友可以了解下
    2021-04-04
  • 解決@Transaction注解導致動態(tài)切換更改數(shù)據(jù)庫失效問題

    解決@Transaction注解導致動態(tài)切換更改數(shù)據(jù)庫失效問題

    這篇文章主要介紹了解決@Transaction注解導致動態(tài)切換更改數(shù)據(jù)庫失效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java實現(xiàn)輸出數(shù)字三角形實例代碼

    Java實現(xiàn)輸出數(shù)字三角形實例代碼

    大家好,本篇文章主要講的是Java實現(xiàn)輸出三角形實例代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Spring Boot線程池使用的一些實用心得

    Spring Boot線程池使用的一些實用心得

    理論上線程越多程序可能更快,但在實際使用中我們需要考慮到線程本身的創(chuàng)建以及銷毀的資源消耗,以及保護操作系統(tǒng)本身的目的我們通常需要將線程限制在一定的范圍之類,這篇文章主要給大家介紹了關(guān)于Spring Boot線程池使用的一些實用心得,需要的朋友可以參考下
    2021-09-09
  • servlet的url-pattern匹配規(guī)則詳細描述(小結(jié))

    servlet的url-pattern匹配規(guī)則詳細描述(小結(jié))

    在利用servlet或Filter進行url請求的匹配時,很關(guān)鍵的一點就是匹配規(guī)則。這篇文章主要介紹了servlet的url-pattern匹配規(guī)則詳細描述(小結(jié)),非常具有實用價值,需要的朋友可以參考下
    2018-07-07

最新評論

东明县| 上栗县| 正安县| 将乐县| 蒲江县| 曲沃县| 天等县| 调兵山市| 临城县| 渑池县| 华宁县| 新竹县| 洮南市| 武义县| 铅山县| 翁源县| 论坛| 保德县| 龙江县| 广水市| 凤冈县| 佛坪县| 裕民县| 横山县| 光山县| 西林县| 察雅县| 凌云县| 昌图县| 门源| 焉耆| 南通市| 来安县| 达尔| 仙桃市| 永仁县| 大英县| 苍山县| 平山县| 望城县| 加查县|