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