
前言
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
|
public class VO { public static int a = 1; private long b = 19l; }
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(); } } }
|
近期评论