历史
JEP 260
是Java9中一项重要内容,意在封装那些JDK内部使用的API,而不再提供给外部应用使用。
鉴于类似Unsafe这类非常关键而广泛使用的API,目前也没有非常有效的替代方案,暂时得到了保留,因此在JDK9中,我们仍然可以使用Unsafe类,目前没有被内部封装。
在JDK9中jdk.internal.misc中也可以找到Unsafe类。
JDK9中没有被封装的关键内部类有:
- sun.misc.{Signal,SignalHandler}
- sun.misc.Unsafe (许多功能可以通过variable handles实现,后面介绍)
- sun.reflect.ReflectionFactory
- com.sun.nio.file.{ExtendedCopyOption,ExtendedOpenOption, ExtendedWatchEventModifier,SensitivityWatchEventModifier}
这些类在以后的版本中可能被移除或封装。而非关键类例如sun.misc.BASE64Encoder和sun.misc.BASE64Decoder则直接被移除了。
说明
Unsafe类名的意思就是“不安全的”,警告开发者们一定要慎重使用该类。
应用
1 |
Field f = Unsafe.class.getDeclaredField("theUnsafe"); |
JDK9中其实已经没有了上述限制,参考Unsafe源码对比。
1 |
package jdk.internal.misc; |
1 |
package sun.misc; |
未来的替代者Variable Handles
https://www.voxxed.com/2016/11/java-9-series-variable-handles/
java.lang.invoke.VarHandle
参考文档
https://www.jianshu.com/p/54cc20a87502
https://blog.csdn.net/luzheqi/article/details/79097682
http://ifeve.com/java-9-sun-misc-unsafe/comment-page-1/
https://www.zybuluo.com/kiraSally/note/867462
https://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-F7696E02-A1FB-4D5A-B1F2-89E7007D4096