日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

accessdeniedexception: 不允许访问_一招解决JDK9以上非法反射访问警告

發布時間:2024/9/3 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 accessdeniedexception: 不允许访问_一招解决JDK9以上非法反射访问警告 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果覺得文章好看,歡迎點贊。同時歡迎關注微信公眾號:氷泠之路。

1 問題描述

JDK9以上很多庫都有這種非法反射訪問的警告,比如protostuff:

解決方法兩個:

  • JDK降級
  • 添加JVM參數

2 原因

降到JDK8能解決以上問題。

但是這不是本文的重點。

先說一下出現該警告的原因,筆者使用的JDK為OpenJDK 11,JDK9以上模塊不能使用反射去訪問非公有的成員/成員方法以及構造方法,除非模塊標識為opens去允許反射訪問。舊JDK制作的庫(JDK8及以下)運行在JDK9上會自動被標識為未命名模塊,為了處理該警告,JDK9以上提出了一個新的JVM參數:--illegal-access。

3 --illegal-access

該參數有四個可選值:

  • permit:默認值,允許通過反射訪問,因此會提示像上面一樣的警告,這個是首次非法訪問警告,后續不警告
  • warn:每次非法訪問都會警告
  • debug:在warn的基礎上加入了類似e.printStackTrace()的功能
  • deny:禁止所有的非法訪問除了使用特別的命令行參數排除的模塊,比如使用--add-opens排除某些模塊使其能夠通過非法反射訪問

因此解決的辦法很簡單,將其設置為deny,并添加--add-opens開啟對應的允許非法反射訪問的模塊即可。

可以通過先設置為debug找到對應的非法訪問的代碼,比如protostuff中的非法反射訪問代碼段如下:

這都是JDK基本模塊的代碼,因此,添加--add-opens=java.base/java.lang.invoke=ALL-UNNAMED即可。--add-opens可以使模塊中的包對其他模塊開放,這樣就可以在運行期使用深層反射訪問該程序包中的所有成員類型。

4 總結

因此解決的辦法是添加如下兩個JVM參數:

--illegal-access=deny?--add-opens?java.base/java.lang=ALL-UNNAMED

IDEA可以在運行配置中的VM options中添加:

如果使用Maven打包的時候還是會出現警告,可以在IDEA中的Maven配置中添加全局的Maven參數:

另外,如果使用Gradle而不是Maven作為管理工具,Gradle測試的時候還是會顯示警告,盡管Gradle運行配置里面有VM Options選項:

但在這里添加是沒用的,正確的做法是在build.gradle中添加:

test?{
????useJUnitPlatform()
????jvmArgs('--illegal-access=deny')
????jvmArgs('--add-opens',?'java.base/java.lang.invoke=ALL-UNNAMED')
}

這樣Gradle測試也沒有問題了。

總結

以上是生活随笔為你收集整理的accessdeniedexception: 不允许访问_一招解决JDK9以上非法反射访问警告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。