java - 从 Java 8 迁移到 Java 11。在运行时,是否可以从用 Java 8 编译的库中的类文件访问 JDK 内部 API?
问题描述
我了解从我的项目代码中对 JDK 内部 API 的任何访问都将在编译时被 Java 编译器标记。但是用 Java 8 编译的 3rd 方库 JAR 呢?
我的理解是,由于它们是在 JDK 8 或更早版本上编译的,它们最终会出现在类路径中。这些类中的代码可以在运行时访问 JDK 内部 API。那是对的吗?
这是来自 JDK 9 发行说明: JDK 9 Release Notes
所有 JDK 内部类也在运行时封装,但大多数仍然可供类路径上的应用程序和库访问。具体来说,JDK 8 中存在的 JDK 内部包中的所有公共类仍然可供类路径上的代码访问。
所以,如果我的项目依赖于访问 JDK 内部的库 X(在 JDK 8 中编译),我应该没问题吧?
解决方案
不。如果您依赖已从 JDK 中删除的内容,即使是间接依赖,那么在 JDK 8 上编译良好的代码将无法在 JDK 11 上运行时运行。
您依赖于您的代码期望在运行时在类路径中可用的某些类。如果这个期望没有得到满足,它就不会起作用。已故意从 JDK 中删除项目;它们不仅躲避编译器,而且实际上已经消失了。
如果您可以具体说明您所依赖的内部结构,我们可以为您提供更多详细信息。
推荐阅读
- javascript - 使用 AG 网格时是否可以只显示列行?
- c - 在 C 编程语言中使用逻辑运算符解决问题
- redis - 我应该在哪里存放我的购物车?是否值得存储在 Azure 购物车解决方案或数据库中?
- python-3.x - pyinstaller /waf 即使在安装 c++ 后也失败了
- datatables - 数据表 column.render
- c++ - 基于链表的优先队列
- javascript - 使用聚合框架从给定条目重构数据
- javascript - 如何使用 Playwright 在异步函数中创建循环?
- html - 如何防止导航滑入下一行?
- php - 为什么elquent的速度低于db query builder?