我读到here如果Oracle在Java 9中删除了sun.misc.Unsafe
,那么Spring和许多其他流行的库将会中断。但是,在Spring或Hibernate中没有对此类的静态引用。那么,这个说法是真的吗?
BTW在Java 8中有64个对Unsafe
的引用,但如果Oracle删除了该类,它们将更新所有类,并且不会影响任何库(除非它们直接使用Unsafe
)。
答案 0 :(得分:8)
一般的想法是:
Unsafe
API 以下是JEP260的一些相关文字(摘自2015年10月20日):
在JDK 9中,我们建议:
默认情况下封装所有非关键内部API:定义它们的模块不会导出其包供外部使用。 (作为最后的手段,在编译时和运行时都可以通过命令行标志访问此类API,除非出于其他原因修改或删除这些API。)
以相同的方式和相同的最后一种解决方法封装JDK 8中支持的替换项的关键内部API。 (受支持的替换是Java SE 8标准的一部分(即,在java。*或javax。*包中),或者是JDK特定的,并使用@ jdk.Exported注释(通常在com.sun中。 *或jdk。*包)。)
不封装JDK 8中不存在受支持的替换的关键内部API,并且在JDK 10中弃用那些支持JDK 9替换的API,意图封装它们,甚至可能删除它们。
...
JDK 9中引入替换的关键内部API将在JDK 9中弃用,并在JDK 10中封装或删除。
答案 1 :(得分:5)
也许引用不是Spring或Hibernate的核心,而是其他地方。链接的文件说明了Spring
Spring Framework(通过Objenesis,带有后备)
我试图在我正在进行的项目中搜索不安全的用法,所以仍然有一些库可能会破坏。
快速搜索的结果:
答案 2 :(得分:5)
This资源可以正确理解JDK 9的当前状态及其功能。社区开始讨论与Unsafe及其未来的未来相关的Java。给定的文档是社区对JEP-260作出反应的努力,该given建议隐藏一些内部API,但保留一些关键API,其中包括不安全的。从文档中提取出来:
建议在JDK 9中保持可访问的关键内部API是:
sun.misc.Cleaner
sun.misc。{信号,SignalHandler}
sun.misc.Unsafe(这里的许多方法的功能 class现在可以通过变量句柄(JEP 193)获得。)
sun.reflect.Reflection :: getCallerClass(此功能 方法可以通过JEP 259以标准形式提供。)
sun.reflect.ReflectionFactory
总而言之,至少基于SQL Fiddle JEP,不安全应该保留。
答案 3 :(得分:3)
答案在链接文档中。 Spring并不直接依赖Unsafe
,但Spring依赖于Objenesis,而Objenesis依赖于Unsafe
。
Spring对Objenesis的依赖本身有点奇怪。 Spring的构建脚本获取Objenesis二进制文件并使用JarJar工具进行字节码级更改。您可以在以下构建脚本中查看它的作用:https://github.com/spring-projects/spring-framework/blob/master/build.gradle(在撰写本文时,请参阅第326-343行和第347行)。
这实质上意味着Spring的“spring-core”二进制文件最终在org.springframework.objenesis。*包结构中包含一堆类,但这些类最初存储在Objenesis GitHub的源代码中,作为二进制文件发布。 Objenesis团队在Spring的构建过程中获取,重新打包到org.springframework。*包,然后作为Spring的一部分重新发布。这就是你找不到它们的原因。
Spring使用Unsafe
(通过Objenesis)创建类而不先调用构造函数。