錯誤解決:Unable to make {member} accessible: module {A} does not 'opens {package}' to {B}

dubbo 序列化時控制臺輸出一個錯誤:

java.lang.reflect.InaccessibleObjectException: 
Unable to make field final int java.math.BigInteger.signum accessible: module java.base does not "opens java.math" to unnamed module @7941a8ff
...

錯誤特征:

Unable to make {member} accessible: module {A} does not 'opens {package}' to {B}

造成原因:

從錯誤的提示可以看出是 java.base 包沒有開放到任意模塊下,而模塊又通過反射使用了一些包內的屬性值,這樣的操作是不允許的。這種情況一般在使用高于 Java 8 版本的 JDK 時會出現,原因是在 Java 9 及之后的版本對源碼進行了模塊化重構,public 不再意味著完全開放,而是使用了 export 的機制來更細粒度地控制可見性。

解決方案:

添加 JVM參數:--add-opens {A}/{package}={B}
期中 {B} 通常是運行時才能確定的hash值, 所以 JVM 參數可寫成 --add-opens {A}/{package}=ALL-UNNAMED 表示開放給所有未命名實例
比如我遇到的錯誤就可以加如下參數解決:

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

參考:
https://stackoverflow.com/questions/41265266/how-to-solve-inaccessibleobjectexception-unable-to-make-member-accessible-m

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容