开发者学堂课程【Java 高级编程:Unsafe 工具类】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/20/detail/384
Unsafe 工具类
一、 反射
反射是 java 第一大特点,一旦打开了反射的大门,就可以有了更加丰富的类设计形式。
除了 jvm 本身支持的反射处理之外,在 java 里面也提供有一个 unsafe 类(不安全的操作),这个类的主要特点是可以利用反射来获取对象,并且直接使用底层的 c 加加来代替 gvm 执行,即可以绕过 jvm 的相关的对象的管理机制。
如果一旦使用了 unsafe 类,那么你的项目之中将无法继续使用 gvm 的内存管理机制以及垃圾回收处理。
但是如果要想使用 unsafe 类,首先需要确认一下这个类之中定义的构造方法与常量问题:
构造方法:
Private Unsafe(){}
私有常量:
Private static final Unsafe theUnsafe = new Unsafe();
但是需要注意的是,在这个 unsafe 类里面并没有提供 Static 方法,即不能够通过类似于传统的单例设计模式之中提供的样式来进行操作,如果要想获得这个类的对象,就必须利用反射机制来完成。
代码如下:
package cn.mldn.demo;
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Fieldfield= Unsafe.class.getDeclaredField("theUnsafe");field.setAccessible(true);
Unsafe unsafeobject =(u.Field.get(null);
}
}
代码执行正常完成。
在传统的开发之中,一个程序类必须要通过实例化对象后,才可以调用类中的普通方法,尤其是以单例设计模式为例。
Singleton.getInstance().print();
class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() (
System.out.println("***** Singleton英构道******);
public static Singleton getInstance(){
return INSTANCE ;
代码相当于利用 unsafe 类绕过了 jvm 的管理机制,可以在没有实例化对象的情况下,获取一 个 singleton 类实例化对象。
Unsafe 最大的特征就是绕过实例化对象管理。
Unsafe 只能够说为我们的开发提供了一些更加方便的处理机制,但是这种操作由于不受 jvm 的操作管理,如果不是必须的情况下,不建议使用,而讲解这个类,主要的目的是帮助大家巩固对于反射的理解,同时也帮助大家在笔试时,如果问到单例设计模式的情况下,也可以追加一个 unsafe,以加深对这一概念的理解,从而获得较好效果。