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

造成原因:

从错误的提示可以看出是 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