sun.mics.Unsafe类。
这是个Unsafe,虽然用它可以直接操作内容了,但是相应的会带来很多安全隐患。
Unsafe的构造器是私有的,直接new不行,截取部分源码:
public final class Unsage{
private Unsafe() {
}
@CallerSensitive
public static Unsafe getUnsafe() {
Class var0 = Reflection.getCallerClass();
if (!VM.isSystemDomainLoader(var0.getClassLoader())) {
throw new SecurityException("Unsafe");
} else {
return theUnsafe;
}
}
}
而且会检查调用getUnsafe()方法的类加载器是不是Bootstrap类加载器,不是就抛出异常,我们直接调用的话,是App类加载器。
为了能访问到私有构造函数,首先我们得把安全检查关掉,类似这样:
try{
Constructor constructor = Thing.class.getConstructor();
constructor.setAccessible(true);
}catch(NoSuchMethodException e){
e.printStackTrace();
}
既然new不行,那么想要创建实例的话,我们可以借助反射机制或者是构造器:
Constructor二、方法constructor1 = Unsafe.class.getConstructor(); // 通过构造器 Unsafe unsafe = constructor1.newInstance(); // 通过字段 Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); Unsafe unsafe1 = (Unsafe) field.get(null); // 创建实例 Thing thing = (Thing) unsafe.allocateInstance(Thing.class); Thing thing1 = (Thing) unsafe1.allocateInstance(Thing.class);
主要围绕内存地址入口,地址偏移量。
这里不具体展开了,只列举了几个,有兴趣的可以查阅资料进一步了解。
这个就是用来创建实例的:
Thing thing = (Thing) unsafe.allocateInstance(Thing.class);
借助unsafe实例,不需要通过构造器。
2、putObject()修改对象成员变量。
3、compareAndSwapInt()修改int属性值,原子操作。
4、allocateMemory()分配内存。



