高版本jdk的访问私有成员属性的正确姿势

在jdk17+已经不能直接通过 setAccessible 来访问私有属性了

Field name = access.getClass().getDeclaredField("name");
name.setAccessible(true);
name.set(access,"6666");// AccessTest{name='6666'}
System.out.println(access);

以上代码在jdk17+会抛出异常,可能在jdk 12+也会抛出异常,jdk高版本更新了安全域机制。

Unable to make field private static XXXXXXXXXXXXXXXXXX VVVVVVVVVVVVVVVVVVVVVVVVVV accessible: module javafx.graphics does not "opens XXXXXXXXXXXXXXXXXX" to unnamed module @64a294a6

虽然高版本不能直接反射访问私有变量、方法。我们可以通过添加jvm运行参数来允许

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

--add-exports
javafx.graphics/com.sun.javafx.geom=ALL-UNNAMED
--add-exports
javafx.graphics/com.sun.javafx.text=ALL-UNNAMED
--add-exports
javafx.graphics/com.sun.javafx.scene.text=ALL-UNNAMED
--add-opens
javafx.graphics/javafx.scene.text=ALL-UNNAMED
--add-opens
javafx.graphics/com.sun.javafx.text=ALL-UNNAMED
--add-opens
javafx.graphics/com.sun.javafx.application=ALL-UNNAMED
--add-opens
java.base/java.lang.reflect=ALL-UNNAMED
posted @   凌康  阅读(2323)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示