keac's Bolg.

Java Unsafe

字数统计: 179阅读时长: 1 min
2022/05/24 Share

Unsafe 是Java底层API的一个类,从名字就知道这个类不太安全。

Unsafe提供了非常底层的内存、CAS、线程调度、类、对象等操作

反射调用Unsafe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 反射获取Unsafe的theUnsafe成员变量
Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");

// 反射设置theUnsafe访问权限
theUnsafeField.setAccessible(true);

// 反射获取theUnsafe成员变量值
Unsafe unsafe = (Unsafe) theUnsafeField.get(null);

/*通过反射实例的方式*/

// 获取Unsafe无参构造方法
Constructor constructor = Unsafe.class.getDeclaredConstructor();

// 修改构造方法访问权限
constructor.setAccessible(true);

// 反射创建Unsafe类实例,等价于 Unsafe unsafe1 = new Unsafe();
Unsafe unsafe1 = (Unsafe) constructor.newInstance();

allocateInstance无视构造方法创建类实例

1
2
//UnSafeTest为不能直接通过反射方法调用的类
UnSafeTest test = (UnSafeTest) unsafe1.allocateInstance(UnSafeTest.class);
CATALOG
  1. 1. 反射调用Unsafe
  2. 2. allocateInstance无视构造方法创建类实例