Unsafe类的最大特点是可以利用反射来获取对象,并且直接使用底层C++语言来代替JVM执行,即可以绕过JVM的相关对象的管理机制。一旦使用了Unsafe类,那么项目中将无法继续使用JVM的内存管理机制以及垃圾回收处理。
使用Unsafe类绕过实例化对象管理来过去对象实例的例子:
package com.mydemo;
import sun.misc.Unsafe;
import java.lang.reflect.Field;
public class UnsafeDemo {
public static void main(String[] args) throws Exception {
// 获取成员属性
Field field = Unsafe.class.getDeclaredField("theUnsafe");
// 解除封装
field.setAccessible(true);
// 获取static成员属性
Unsafe unsafeObject = (Unsafe) field.get(null);
// 利用Unsafe类绕过了JVM的管理机制,
// 可以在没有实例化对象的情况下获取一个Singleton类实例化对象
Singleton singleton = (Singleton) unsafeObject.allocateInstance(Singleton.class);
// 对象调用方法
singleton.print();
}
}
class Singleton {
public Singleton() {
System.out.println("Singleton构造类");
}
public void print() {
System.out.println("打印方法");
}
}
运行结果:
打印方法