错误解决: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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容