0
点赞
收藏
分享

微信扫一扫

cannot access class jdk.internal.misc.Unsafe(java9的模块概念)

后来的六六 2022-03-20 阅读 54
java

现象
java11的本地环境,服务中使用到netty。启动后,服务无法访问,查看日志,有提示:
cannot access class jdk.internal.misc.Unsafe ... because the module java.base not export jdk.internal.misc to unnamed module

解决办法
stackoverflow给了原因以及解决办法。
在这里插入图片描述

--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
-Dio.netty.tryReflectionSetAccessible=true

到了这里就完了。但是为什么呢?他还指出了是java9的module概念。

作为一个刨根问底的程序员,当然要去看看。

Understanding Java 9 Modules
里面介绍了java9的概念,语法。大概一看,就是为了让Java环境更小、强封装等。

在这里插入图片描述

环境更小
好理解,只为设备安装需要的module。
强封装是什么东西?
在这里插入图片描述

其中语法open提到了,以前反射可以访问各种类、成员变量,不管它是public还是private的。实际上破坏了封装。
现在,只能访问export的模块

在这里插入图片描述
允许runtime期间在目标module访问某个package
opens package to comma-separated-list-of-modules

–add-opens等同于open to命令
```–add-opens module/package=target-module(,target-module)*``
在这里插入图片描述
因此我们的--add-opens java.base/jdk.internal.misc=ALL-UNNAMED命令就是让无法访问的jdk.internal.misc允许任何未命名的模块访问。

至于tryReflectionSetAccessible
官网说是告诉netty使用反射。
在这里插入图片描述

其他的,不看了, 还要加班呢。😕

参考
https://stackoverflow.com/questions/57885828/netty-cannot-access-class-jdk-internal-misc-unsafe
https://github.com/netty/netty/issues/7769
https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
https://segmentfault.com/a/1190000013409571

举报

相关推荐

0 条评论