如何获得java对象的内存地址

 在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,如下代码片段:

Java代码   收藏代码
  1. package com.bijian.study;  
  2.   
  3. import java.lang.reflect.Field;  
  4. import sun.misc.Unsafe;  
  5.   
  6. public class Addresser {  
  7.       
  8.     private static Unsafe unsafe;  
  9.   
  10.     static {  
  11.         try {  
  12.             Field field = Unsafe.class.getDeclaredField("theUnsafe");  
  13.             field.setAccessible(true);  
  14.             unsafe = (Unsafe) field.get(null);  
  15.         } catch (Exception e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.     }  
  19.   
  20.     public static long addressOf(Object o) throws Exception {  
  21.           
  22.         Object[] array = new Object[] { o };  
  23.   
  24.         long baseOffset = unsafe.arrayBaseOffset(Object[].class);  
  25.         int addressSize = unsafe.addressSize();  
  26.         long objectAddress;  
  27.         switch (addressSize) {  
  28.         case 4:  
  29.             objectAddress = unsafe.getInt(array, baseOffset);  
  30.             break;  
  31.         case 8:  
  32.             objectAddress = unsafe.getLong(array, baseOffset);  
  33.             break;  
  34.         default:  
  35.             throw new Error("unsupported address size: " + addressSize);  
  36.         }  
  37.         return (objectAddress);  
  38.     }  
  39.   
  40.     public static void main(String... args) throws Exception {  
  41.         Object mine = "Hi there".toCharArray();  
  42.         long address = addressOf(mine);  
  43.         System.out.println("Addess: " + address);  
  44.   
  45.         // Verify address works - should see the characters in the array in the output  
  46.         printBytes(address, 27);  
  47.     }  
  48.   
  49.     public static void printBytes(long objectAddress, int num) {  
  50.         for (long i = 0; i < num; i++) {  
  51.             int cur = unsafe.getByte(objectAddress + i);  
  52.             System.out.print((char) cur);  
  53.         }  
  54.         System.out.println();  
  55.     }  
  56. }  

运行结果:



另一篇java对象内存地址的文章:Java直接内存读写


  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值