Unsafe 对象是什么?
由于java 是运行在 jvm无法直接操作操作系统底层,使用 Unsafe 里面的 native 方法可以借助其他语言(C++等)直接访问操作系统底层.这个类主要用来提供一些原子操作或者直接获得内存内某个地址偏移量的数值.但是这个类的构造函数是 private 的.所以只能通过反射的方式获得.
package com.example.springbootlearncache.base;
import sun.misc.Unsafe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
/**
* @author <a href=mailto:libing22@meituan.com>binggo</a>
* @since 2018/12/28
**/
public class UnsafeAssess {
private static final String ANDROID = "THE_ONE";
private static final String OPEN_JDK = "theUnsafe";
private static Unsafe UNSAFE;
/*通过反射直接获得字段,设置为可以访问,通过反射获得构造函数设置成可以访问,通过构造函数生成对象,field.get(null)*/
static {
Field field = null;
try {
field = Unsafe.class.getDeclaredField(OPEN_JDK);
} catch (NoSuchFieldException e) {
try {
field = Unsafe.class.getDeclaredField(ANDROID);
} catch (NoSuchFieldException e1) {
try {
Constructor<Unsafe> constructor = Unsafe.class.getDeclaredConstructor();
constructor.setAccessible(true);
UNSAFE = constructor.newInstance();
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e2) {
throw new Error(e2);
}
}
}
if (field != null) {
field.setAccessible(true);
try {
UNSAFE = (Unsafe) field.get(null);
} catch (IllegalAccessException e) {
throw new Error(e);
}
}
}
private UnsafeAssess() {
}
public static Unsafe get() {
return UNSAFE;
}
}
拿到 Unsafe 类之后就可以对内存进行为所欲为的操作了