偏移地址

前言

JDK提供了sun.misc.Unsafe计算字段的偏移地址

反射获取Unsafe对象

1
2
3
4
5
6
7
8
public class  {

public static Unsafe getInstance() throws Exception {
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
return (Unsafe) unsafeField.get(null);
}
}

获取偏移地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// VO.java
public class VO {
public static int a = 1;
private long b = 19l;
}

// OffsetTest.java
public class OffsetTest {

public static void main(String[] args) {
try {
Unsafe unsafe = UnsafeUtils.getInstance();
long aFieldOffset = unsafe.staticFieldOffset(VO.class.getField("a"));
long bFieldOffset = unsafe.objectFieldOffset(VO.class.getDeclaredField("b"));
System.out.println("aFieldOffset is: " + aFieldOffset);
System.out.println("bFieldOffset is: " + bFieldOffset);
VO vo = new VO();
long bFieldValue = unsafe.getLong(vo, bFieldOffset);
System.out.println("bFieldValue is: " + bFieldValue);
} catch (Exception e) {
e.printStackTrace();
}
}
}