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

java9區(qū)分opens與exports

 更新時間:2018年02月27日 14:06:18   作者:codecraft  
本篇文章主要給大家講述了java9中opens與exports的區(qū)別以及用法的不同之處,一起學習下吧。


本文主要研究下遷移到java9的一些注意事項。

遷移種類

  1. 代碼不模塊化,先遷移到jdk9上,好利用jdk9的api
  2. 代碼同時也模塊化遷移

幾點注意事項

不可讀類

比如sun.security.x509,在java9中歸到java.base模塊中,但是該模塊沒有export該package

可以通過運行的時候添加--add-exports java.base/sun.security.x509=ALL-UNNAMED來修改exports設定

內(nèi)部類

比如sun.misc.Unsafe,原本只想讓oracle jdk team來使用,不過由于這些類應用太廣泛了,為了向后兼容,java9做了妥協(xié),只是將這些類歸到了jdk.unsupported模塊,并沒有限定其可讀性。

➜ ~ java -d jdk.unsupported
jdk.unsupported@9
exports com.sun.nio.file
exports sun.misc
exports sun.reflect
requires java.base mandated
opens sun.misc
opens sun.reflect

刪除的類

java9刪除了sun.misc.BASE64Encoder,這種情況只能改用其他api,比如java.util.Base64

classpath vs module-path

java9引入了模塊系統(tǒng),同時自身的jdk也模塊化了,引入了module-path,來屏蔽classpath,也就是說在java9優(yōu)先使用module-path,畢竟jdk本身都模塊化了,應用本身沒有模塊化的話,java9通過unnamed modules及automatic modules機制來隱式模塊化,當然classpath在java9上還能繼續(xù)使用,比如配合module-path使用等。

沒有模塊化的jar在classpath會被歸到unnamed modules;在module-path則會被自動創(chuàng)建為automatic modules(一個automatic modules會聲明transitive依賴所有named和unnamed module,然后導出自身的package)

一個包名不能在多個模塊中出現(xiàn)(split packages)

因為模塊中可以exports指定包給其他模塊,如果多個模塊exports同樣的包名會造成混亂,特別若有其他類庫同時requires這兩個模塊,就不知道該引用那個模塊的了。

傳遞依賴

如果一個模塊的接口參數(shù)或返回類型使用了其他模塊的類,則建議requires transitive它依賴的模塊

小心循環(huán)依賴

在設計模塊的時候,要盡可能考慮到是否會有循環(huán)依賴的問題,如果有則需要重新設計

使用services來實現(xiàn)optional依賴

services特別適合用來解耦調(diào)用方與實現(xiàn)類依賴的問題,如果接口有多種實現(xiàn)類,調(diào)用方不必要requires所有的實現(xiàn)類,只需要requires接口即可,使用services類型來加載實現(xiàn)類的實例。通過在module-path去動態(tài)添加實現(xiàn)模塊實現(xiàn)解耦。

模塊版本管理

module-info.java不支持聲明版本號,但是創(chuàng)建jar包的時候,可以通過--module-version設置。不過模塊系統(tǒng)查找模塊的時候還是使用模塊名來查找(如果module-path里頭有多個重名模塊,則模塊系統(tǒng)知會使用找到的第一個,自動忽略后續(xù)的同名模塊),版本依賴問題不在模塊系統(tǒng)解決范疇內(nèi),交由maven之類的依賴管理工具去管理。

模塊資源訪問

模塊化之后資源文件也收到保護,只能由該模塊去訪問本模塊自身的資源文件,如果需要跨模塊訪問,也必須借助ModuleLayer找到目標模塊,再調(diào)用目標模塊去加載該模塊的資源文件。

反射的使用

這里涉及到deep reflection問題,所謂的deep reflection就是通過反射去調(diào)用一個class的非public元素。module-info.java的exports聲明package只是允許該package直接所屬的類允許訪問其public元素,并不允許反射調(diào)用非public元素。

反射在模塊系統(tǒng)里頭需要特殊聲明才允許使用(使用opens聲明允許deep reflection),這樣就導致很多使用反射的類庫諸如spring,需要額外配置才能遷移到java9。解決方案有兩個:一個是opens package包名給需要反射的模塊,比如spring.beans等;一個就是直接opens整個模塊。

默認--illegal-access=permit,同時該設置只適用于java9之前的package在java9被不允許訪問,不適用于java9中新的不允許訪問的package.(建議遷移到模塊化系統(tǒng)時設置為deny)

不過就是在模塊系統(tǒng)中包名不一樣就屬于不同的包,沒有繼承關(guān)系,比如com.service.func1與com.service.func2這兩個是不同的包,你不能只opens com.service,必須分別指定這樣就導致需要open的的package比較多。因此open整個module可能更省事一點,但也屬于比較粗暴的做法。

上面的做法是在原來module-info.java里頭去做修改,另外一種是在執(zhí)行java或javac的時候通過指定的命令來修改原來的關(guān)系。比如

java ... --add-opens source-module/source-package=target-module

如果需要導出給unnamed modules,則target-module為ALL-UNNAMED

當然如果是新的系統(tǒng),那就不建議使用反射了,可以使用MethodHandles及VarHandles。

常見問題和措施

ClassNotFoundException/NoClassDefFoundError

比如javax.xml.bind.JAXBException,JAXB已經(jīng)歸入到java.xml.bind模塊,在java命名后面添加

--add-modules java.xml.bind

如果圖省事,把$JAVA_HOME及所有第三方類庫添加到module-path,然后來個

--add-modules ALL-MODULE-PATH

illegal reflective access by xxx to method java.lang.ClassLoader.defineClass

反射原因引起,由于舊系統(tǒng)沒有module-info,因此在java命名添加參數(shù)加以修改

--add-opens java.base/java.lang=ALL-UNNAMED

確定依賴的模塊

通過IDE或者jdeps分析

jdeps --class-path 'classes/lib/*' -recursive -summary app.jar

jdeps只是靜態(tài)代碼分析,如果有使用反射用的類jdeps分析不出來,需要自己手工requires,如果dependency是optional的,可以requires static

對模塊單元測試的可讀性問題

如果單元測試時單獨模塊的話,可以在運行時通過--add-exports或--add-opens來授予單元測試模塊對目標模塊的可讀性及反射能力。另外由于split packages問題,單元測試類的包名不能跟目標模塊包名重復。原來maven工程那種test

小結(jié)

可以分兩步走遷移到java9,首先是先不模塊化,只先跑在jdk9上;然后再模塊化。

相關(guān)文章

  • Schedule定時任務在分布式產(chǎn)生的問題詳解

    Schedule定時任務在分布式產(chǎn)生的問題詳解

    這篇文章主要介紹了Schedule定時任務在分布式產(chǎn)生的問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • java 二叉查找樹實例代碼

    java 二叉查找樹實例代碼

    這篇文章主要介紹了java 二叉查找樹實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java實現(xiàn)圖書館借閱系統(tǒng)

    Java實現(xiàn)圖書館借閱系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)圖書館借閱系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java命令設計模式詳解

    Java命令設計模式詳解

    這篇文章主要為大家詳細介紹了Java命令設計模式,對命令設計模式進行分析理解,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 使用spring mail發(fā)送html郵件的示例代碼

    使用spring mail發(fā)送html郵件的示例代碼

    本篇文章主要介紹了使用spring mail發(fā)送html郵件的示例代碼,這里整理了詳細的示例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-09-09
  • java 中sleep() 和 wait() 的對比

    java 中sleep() 和 wait() 的對比

    這篇文章主要介紹了java 中sleep() 和 wait() 的對比的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java實現(xiàn)簡單的五子棋游戲示例代碼

    Java實現(xiàn)簡單的五子棋游戲示例代碼

    這篇文章主要為大家介紹了如何利用Java語言實現(xiàn)簡單的五子棋游戲,文中的示例代碼講解詳細,對我們學習Java游戲開發(fā)有一定幫助,需要的可以參考一下
    2022-05-05
  • java導出pdf文件的詳細實現(xiàn)方法

    java導出pdf文件的詳細實現(xiàn)方法

    這篇文章主要介紹了java導出pdf文件的詳細實現(xiàn)方法,包括制作模板、獲取中文字體文件、實現(xiàn)后端服務以及前端發(fā)起請求并生成下載鏈接,需要的朋友可以參考下
    2025-03-03
  • Java簡單使用redis-zset實現(xiàn)排行榜

    Java簡單使用redis-zset實現(xiàn)排行榜

    這篇文章主要介紹了Java簡單使用redis-zset實現(xiàn)排行榜,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Java應用打包成Docker鏡像

    Java應用打包成Docker鏡像

    這篇文章主要為大家介紹了Java應用打包成Docker鏡像的過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論

盐源县| 河东区| 炉霍县| 兴化市| 大石桥市| 呼图壁县| 容城县| 敦煌市| 东乡| 苏尼特左旗| 临武县| 南城县| 新郑市| 盘山县| 大连市| 同仁县| 炉霍县| 长寿区| 新建县| 花莲市| 贵州省| 萍乡市| 娱乐| 平远县| 固阳县| 罗定市| 兴国县| 南溪县| 大连市| 尉氏县| 家居| 古丈县| 轮台县| 安仁县| 台北市| 云龙县| 方山县| 华容县| 新绛县| 桑植县| 绥芬河市|