Java Unsafe获取对象成员变量相对对象内存地址偏移量
UnsafeTestKlass
public class UnsafeTestKlass {
private int value;
public UnsafeTestKlass() { this(99); }
public UnsafeTestKlass(int value) { this.value = value; }
public int value() { return value; } } |
获取Unsafe
private Unsafe getUnsafe() throws Throwable { Class<?> unsafeClass = Unsafe.class; for (Field f : unsafeClass.getDeclaredFields()) { if ("theUnsafe".equals(f.getName())) { f.setAccessible(true); return (Unsafe) f.get(null); } } throw new IllegalAccessException("no declared field: theUnsafe"); } |
例子
@Test public void getObjectFieldAddressOffset() throws Throwable { Field field = UnsafeTestKlass.class.getDeclaredField("value"); Unsafe unsafe = getUnsafe(); long valueOffset = unsafe.objectFieldOffset(field); System.out.println("value offset: " + valueOffset); } |
<!--EndFragment--> areastRtm-��B P]B r-fareast;mso-hansi-theme-font:minor-fareast; mso-bidi-font-family:"Courier New";color:black;mso-themecolor:text1; mso-font-kerning:0pt'>}