jdk 11 非法反射警告的处理

问题产生:


WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by **YOUR PACKAGE** (file: **YOUR FILE** ) to field java.util.Collections$UnmodifiableMap.m
WARNING: Please consider reporting this to the maintainers of **YOUR PACKAGE**
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

解决办法:


1.降级到jdk8 

2.启动类,增加忽略非法反射警告的办法

@SpringBootApplication
public class XxxxApplication {
 
    public static void main(String[] args) {
        // 调用方法
        disableAccessWarnings(); // 忽略非法反射警告
        SpringApplication.run(XxxxApplication .class, args);
    }
 
    /**
     * 忽略非法反射警告 适用于jdk11
     */
    @SuppressWarnings("unchecked")
    public static void disableAccessWarnings() {
        try {
            Class unsafeClass = Class.forName("sun.misc.Unsafe");
            Field field = unsafeClass.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            Object unsafe = field.get(null);
 
            Method putObjectVolatile =
                unsafeClass.getDeclaredMethod("putObjectVolatile", Object.class, long.class, Object.class);
            Method staticFieldOffset = unsafeClass.getDeclaredMethod("staticFieldOffset", Field.class);
 
            Class loggerClass = Class.forName("jdk.internal.module.IllegalAccessLogger");
            Field loggerField = loggerClass.getDeclaredField("logger");
            Long offset = (Long)staticFieldOffset.invoke(unsafe, loggerField);
            putObjectVolatile.invoke(unsafe, loggerClass, offset, null);
        } catch (Exception ignored) {
        }
    }
}

3.配置JVM 的参数

--illegal-access

该参数有四个可选值:

permit:默认值,允许通过反射访问,因此会提示像上面一样的警告,这个是首次非法访问警告,后续不警告
warn:每次非法访问都会警告
debug:在warn的基础上加入了类似e.printStackTrace()的功能
deny:禁止所有的非法访问除了使用特别的命令行参数排除的模块,比如使用--add-opens排除某些模块使其能够通过非法反射访问

要验证您的应用程序是否已为 JDK 的未来版本做好准备,请将它--illegal-access=deny与任何必要的--add-opens选项一起运行。任何剩余的非法访问错误很可能是由于从编译代码到 JDK 内部 API 的静态引用。您可以通过运行带有该选项的jdeps工具来识别这些--jdk-internals。出于性能原因,当前的 JDK 不会对非法静态访问操作发出警告。

--add-opens

只能在包级别打开模块:

 --add-opens module/package=target-module(,target-module)*

范例:(1) 由于java.util.Collections属于模块中的中的java.util包,因此必须添加JVM参数

 --add-opens java.base/java.util=target-module(,target-module)*

(2)目标模块必须是要访问java.util.Collections$UnmodifiableMap.mALL-UNNAMED模块的模块

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JDK17和JDK11Java Development Kit(Java开发工具包)的不同版本。JDK是用于开发和编译Java应用程序的软件包。JDK17是较新的版本,而JDK11是一个相对较旧但更稳定的版本。 如果您是为了开发或学习Java,通常建议使用较稳定的版本,如JDK11JDK8。 这些版本经过更长时间的测试和验证,因此在稳定性和兼容性方面更可靠。 如果您需要安装JDK11,您可以通过访问Oracle官方网站或在搜索引擎中搜索"Oracle JDK"来找到JDK11的下载链接。 在Oracle产品页面中找到Java部分并点击下载即可找到JDK11的下载链接。 安装JDK11后,您可能需要配置JDK的环境变量。其中包括设置JAVA_HOME变量,将其指向JDK11的安装路径。在Windows操作系统中,可以在系统环境变量中添加JAVA_HOME,并将其值设置为JDK11的安装路径。另外,还需要将JDK11的lib目录下的dt.jar和tools.jar加入到CLASSPATH环境变量中。这样可以确保在开发和编译Java应用程序时,系统能够正确地找到所需的类库和工具。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [win10下同时安装jdk11jdk17并能切换](https://blog.csdn.net/weixin_51909904/article/details/124394907)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [jdk11 jdk17多版本共存切换](https://blog.csdn.net/qq_42724813/article/details/127155727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值