Java Unsafe-获取对象内存地址

Java Unsafe获取对象内存地址

 

public class UnsafeTestKlass {

 

    private int value;

   

    public UnsafeTestKlass() {

       this(99);

    }

   

    public UnsafeTestKlass(int value) {

       this.value = value;

    }

   

    public int value() {

       return value;

    }

}

获取对象内存地址

public long location(Object object) throws Throwable {

Unsafe unsafe = getUnsafe();

      

Object[] array = new Object[] {object};

 

long baseOffset = unsafe.arrayBaseOffset(Object[].class);

int addressSize = unsafe.addressSize();

long location;

switch (addressSize) {

case 4:

location = unsafe.getInt(array, baseOffset);

           break;

       case 8:

           location = unsafe.getLong(array, baseOffset);

           break;

       default:

           throw new Error("unsupported address size: " + addressSize);

    }

    return (location);

}

 

例子

@Test

public void getObjectAddress() throws Throwable {

    UnsafeTestKlass klass = new UnsafeTestKlass();

    long baseAddress = location(klass);

    System.out.println("base address: " + baseAddress);

}

 

猜你喜欢

转载自lobin.iteye.com/blog/2327679