删除Java 9中的sun.misc.Unsafe会破坏Spring,Hibernate

时间:2015-07-14 21:03:02

标签: spring java-9

我读到here如果Oracle在Java 9中删除了sun.misc.Unsafe,那么Spring和许多其他流行的库将会中断。但是,在Spring或Hibernate中没有对此类的静态引用。那么,这个说法是真的吗?

BTW在Java 8中有64个对Unsafe的引用,但如果Oracle删除了该类,它们将更新所有类,并且不会影响任何库(除非它们直接使用Unsafe)。

4 个答案:

答案 0 :(得分:8)

Mark Reinhold在2015年JVM语言峰会期间发表了题为The Secret History and Tragic Fate of sun.misc.Unsafe的演讲。虽然这些会谈有很多免责声明,但您可以在10:23看到提议的方法,JEP260中对此进行了描述。

一般的想法是:

  1. 使用更安全,受支持的API替换现有功能
  2. 弃用之前已替换的Unsafe API
  3. 删除下一版本中已弃用的代码
  4. 以下是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,带有后备)

我试图在我正在进行的项目中搜索不安全的用法,所以仍然有一些库可能会破坏。

快速搜索的结果:

  • 番石榴
  • GWT
  • 的Netty
  • 新泽西州通用
  • 的Infinispan
  • JBoss的模块

答案 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

Unsafehttps://github.com/easymock/objenesis/blob/master/main/src/main/java/org/objenesis/instantiator/sun/UnsafeFactoryInstantiator.java

的客观依赖性

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)创建类而不先调用构造函数。