当前位置: 首页 > news >正文

java17学习笔记-Deprecate the Applet API for Removal

默认情况下封装 JDK 的大多数内部 API,以便它们 在编译时无法访问,并为将来的版本做准备,其中 它们在运行时将无法访问。确保关键的、广泛使用的 内部 API 不会封装,因此它们可以访问,直到 其全部或大部分功能都存在受支持的替换项。

一些流行的库使用非标准、不稳定和不受支持的API,这些API是JDK的内部实现细节,从未打算用于外部使用。在模块化JDK(JEP 200)中,通过利用模块系统(JEP 261)限制对这些API的访问可以提高平台的完整性和安全性,因为许多内部API定义了特权、安全敏感的操作。从长远来看,这一变化将降低JDK本身的维护者以及有意或无意使用这些内部API的库和应用程序的维护者所承担的成本。

起因由于模块化的实行

 JEP 200: The Modular JDK

JEP 201: Modular Source Code

JEP 220: Modular Run-Time Images

JEP 260: Encapsulate Most Internal APIs

JEP 261: Module System

JEP 275: Modular Java Application Packaging

JEP 282: jlink: The Java Linker

发展历史

JEP 260: Encapsulate Most Internal APIs

JEP 396: Strongly Encapsulate JDK Internals by Default

JEP 403: Strongly Encapsulate JDK Internals

JEP 260: Encapsulate Most Internal APIs

JDK 9 中未封装的关键内部 API

  • sun.misc.{Signal,SignalHandler}

  • sun.misc.Unsafe (The functionality of many of the methods in this class is available via variable handles (JEP 193).)

  • sun.reflect.Reflection::getCallerClass(int) (The functionality of this method is available in the stack-walking API defined by JEP 259.)

  • sun.reflect.ReflectionFactory

  • com.sun.nio.file.{ExtendedCopyOption,ExtendedOpenOption, ExtendedWatchEventModifier,SensitivityWatchEventModifier}

JEP 396: Strongly Encapsulate JDK Internals by Default

该提案的主要风险是现有的 Java 代码将无法运行。失败的代码类型包括但不限于:

  • 使用 的方法的框架,以便在现有 类加载器。此类框架应改用 ,它已 从 JDK 9 开始可用。protecteddefineClassjava.lang.ClassLoaderjava.lang.invoke.MethodHandles.Lookup::defineClass

  • 使用类来作时区信息的代码。此类代码应改用 API (自 JDK 8 以来可用)。sun.util.calendar.ZoneInfojava.time

  • 使用包处理 SQL 行集的代码。此类代码应改用包从 JDK 7 开始可用。com.sun.rowsetjavax.sql.rowset

  • 使用包处理源代码的工具 法典。 此类工具应改用 、 和 API,这些 API 自JDK 6 以来可用。com.sun.tools.javac.*javax.toolsjavax.lang.modelcom.sun.source.*

  • 使用类的代码 以生成自签名证书。目前还没有标准 此功能的 API(尽管请求已被 已提交);同时,开发人员可以使用 包含此功能的现有第三方库。sun.security.tools.keytool.CertAndKeyGen

  • 使用 JDK 的 Xerces XML 处理器内部副本的代码。 此类代码应改用 Xerces 库的独立副本,可从 Maven Central 获得。
  • 使用 JDK 内部版本的 ASM 字节码的代码 图书馆。此类代码应改用 ASM 的独立副本 库,可从 Maven Central 获得。

此更改的影响示例

  • 使用直接 访问 JDK 的内部 API 将不再默认工作。 例如

    System.out.println(sun.security.util.SecurityConstants.ALL_PERMISSION);
    //Exception in thread "main" java.lang.IllegalAccessError: class Main (in unnamed module @0x4eec7777) cannot access class sun.security.util.SecurityConstants (in module java.base) because module java.base does not export sun.security.util to unnamed module @0x4eec7777
    //	at Main.main(Main.java:23)
  • 默认情况下,使用反射访问导出java.*API的私有字段的代码将不再工作。

    var ks = java.security.KeyStore.getInstance("jceks");
    var f = ks.getClass().getDeclaredField("keyStoreSpi");
    f.setAccessible(true);
    //Exception in thread "main" java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.security.KeyStoreSpi java.security.KeyStore.keyStoreSpi accessible: module java.base does not "opens java.security" to unnamed module @531d72ca
    //	at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:353)
    //	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:329)
    //	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:277)
    //	at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:179)
    //	at java.base/java.lang.reflect.Field.setAccessible(Field.java:173)
    //	at Main.main(Main.java:22)
  • 默认情况下,使用反射调用导出java.*API的受保护方法的代码将不再工作。

    Method dc = ClassLoader.class.getDeclaredMethod("defineClass",String.class,byte[].class,int.class,int.class);
    dc.setAccessible(true);
    //Exception in thread "main" java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @f6f4d33
    //	at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:353)
    //	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:329)
    //	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:277)
    //	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:182)
    //	at java.base/java.lang.reflect.Method.setAccessible(Method.java:176)
    //	at Main.main(Main.java:35)

JEP 403: Strongly Encapsulate JDK Internals

本JEP的目标、非目标、动机、风险和假设部分与JEP 396基本相同,但为方便读者,此处转载。

http://www.xdnf.cn/news/1329679.html

相关文章:

  • LCC-LCC谐振式无线充电系统控制技术研究的复现
  • 期权小故事:王安石变法与期权
  • 前端本地模糊搜索1.0 按照匹配位置加权
  • 土地财政历史探寻
  • Diamond开发经验(1)
  • RabbitMQ:SpringAMQP Direct Exchange(直连型交换机)
  • 走进数字时代,融入数字生活,构建数字生态
  • Arthas 全面使用指南:离线安装 + Docker/K8s 集成 + 集中管理
  • 开源 C++ QT Widget 开发(一)工程文件结构
  • 猫头虎AI分享|字节开源了一款具备长期记忆能力的多模态智能体:M3-Agent 下载、安装、配置、部署教程
  • Java NIO 核心精讲(上):Channel、Buffer、Selector 详解与 ByteBuffer 完全指南
  • Python量化交易:结合爬虫与TA-Lib技术指标分析
  • Vue2.x核心技术与实战(二)
  • 力扣hot100:三数之和(排序 + 双指针法)(15)
  • Android Cordova 开发 - Cordova 嵌入 Android
  • 谷歌为什么要将Android的页面大小(Page Size)从传统的4KB升级至16KB
  • Android RxJava数据库操作:响应式改造实践
  • Android-ContentProvider的跨应用通信学习总结
  • 2943. 最大化网格图中正方形空洞的面积
  • MCP(模型上下文协议):是否是 AI 基础设施中缺失的标准?
  • 电源、电流及功率实测
  • 【图像算法 - 18】慧眼辨良莠:基于深度学习与OpenCV的麦田杂草智能识别检测系统(附完整代码)
  • RabbitMQ:SpringAMQP 入门案例
  • 【自动驾驶】8月 端到端自动驾驶算法论文(arxiv20250819)
  • 最新研究进展:2023-2025年神经机器翻译突破性成果
  • 【LeetCode】17. 电话号码的字母组合
  • idea中如何设置文件的编码格式
  • 【撸靶笔记】第七关:GET - Dump into outfile - String
  • Python爬虫实战:研究ICP-Checker,构建ICP 备案信息自动查询系统
  • 【MySQL】--- 库表操作