获取对象的内存地址

来源:互联网 发布:陈奕迅热门歌曲知乎 编辑:程序博客网 时间:2024/06/05 15:52

原文:http://www.wang1314.com/doc/topic-957792-1.html

package com.bijian.study;import java.lang.reflect.Field;import sun.misc.Unsafe;public class Addresser {private static Unsafe unsafe;static {try {Field field = Unsafe.class.getDeclaredField("theUnsafe");field.setAccessible(true);unsafe = (Unsafe) field.get(null);} catch (Exception e) {e.printStackTrace();}}public static long addressOf(Object o) throws Exception {Object[] array = new Object[] { o };long baseOffset = unsafe.arrayBaseOffset(Object[].class);int addressSize = unsafe.addressSize();long objectAddress;switch (addressSize) {case 4:objectAddress = unsafe.getInt(array, baseOffset);break;case 8:objectAddress = unsafe.getLong(array, baseOffset);break;default:throw new Error("unsupported address size: " + addressSize);}return (objectAddress);}public static void main(String... args) throws Exception {Object mine = "Hi there".toCharArray();long address = addressOf(mine);System.out.println("Addess: " + address);// Verify address works - should see the characters in the array in the outputprintBytes(address, 27);}public static void printBytes(long objectAddress, int num) {for (long i = 0; i < num; i++) {int cur = unsafe.getByte(objectAddress + i);System.out.print((char) cur);}System.out.println();}}

0 0
原创粉丝点击