在Java 17中,我如何避免诉诸--add-opens?

2022-09-01 12:17:48

从Java 17开始,它实际上已经过时 https://openjdk.java.net/jeps/403--illegal-access

此选项的任何使用(无论是允许、警告、调试还是拒绝)除了发出警告消息外,不会产生任何影响。我们希望在将来的版本中完全删除 --illegal-access 选项。

正因为如此,使用openjdk17抢先体验版本,我看到 https://github.com/FasterXML/jackson-databind/issues/3168 的问题。在我看来,他们正在倡导使用,并努力设想一个整体的“修复”。jackson--add-opens

我想避免添加,因为如果不是,那就是下一个依赖项。我不想因为依赖关系的变化而跨环境更改 JVM 参数。如何避免这种情况?--add-opensjackson


答案 1

你没有,JDK内部被封装是有原因的。

...

...

好吧,他们现在走了吗?

你可以使用麦肯齐·斯科特(Mackenzie Scott)的《霸王》(Overlord)来做各种没有人应该做的非常危险的事情,包括但不限于:

  • 在不调用其构造函数的情况下创建对象
  • 将值强制转换为不兼容的类型
  • 直接管理内存,事实上,
  • 强制访问 JDK 内部。

具体而言,请参阅(或者更确切地说,看不到)和 。Overlord.breakEncapsulation(Class, Class, boolean)Overlord.allowAccess(Class, Class, boolean)


答案 2

本文中可以看出,您可以通过Burningwave Core库的方法在运行时导出模块来避免诉诸于此:--add-opens

  • org.burningwave.core.assembler.StaticComponentContainer.Modules.exportAllToAll()
  • org.burningwave.core.assembler.StaticComponentContainer.Modules.exportPackageToAllUnnamed("java.base","java.lang")

推荐