假设
Integer integerA = 500;
我想打印返回的参考资料。
要将对对象的引用作为数字,您可以在支持它的JVM上使用Unsafe。您可以将引用放在数组中,并使用Unsafe.getInt()对32位引用进行访问(注意:大多数64位JVM将使用32位引用)或Unsafe.getLong()这将以数字形式访问引用,但是如果GC发生并且对象被移动,那么一旦得到它,它就可能改变。
另一个复杂的问题是CompressedOops意味着对象的索引可以用多种不同的方式转换。为了保持简单,我建议使用4GB到26GB的堆。对于这些大小,您可以将地址移动<< 3
以获得地址。
BTW您可以使用Unsafe.putInt(x,1,hashCode)来覆盖系统hashCode.;)
最接近显示引用的是哈希代码,因为它将由Object,System.IdentityHashCode()计算。当然,Integer会覆盖hashCode,所以Integer自己的hashCode()方法肯定与它的引用无关。
事实上,不能保证System.IdentityHashCode与引用有任何关系——它只是一个在为同一对象计算时始终相同的数字,而在不同对象中则尽可能不同。
人们一直在回答hashCode()
,但hashCode()
对于Integer
来说是Integer
的值,它与它在内存中的位置无关。此外,通常,仅仅因为两个Objects
具有相同的hashCode()
,而不是并不意味着它们引用相同的Object
。
编辑(回应评论):
即使您使用IdentityHashCode(),它提供了hashCode()
的非重写版本,您仍然无法获得内存地址。
在Integer类中打印重载版本的"toString"方法。通常,如果一个类没有重载该方法,它会打印类名+哈希代码。像这样的事情(你必须手工完成):
integerA.getClass().getName() + "@" + integerA.hashCode()
我不相信可以在Java中获得对象的实际内存位置(用于打印或其他目的)。即使在执行System.out.println(new Object())
时,您看到的也不是"引用"位置,而是包含对象哈希代码的字符串。
各个类的默认toString
方法涉及hashCode
方法的结果。也许你正在寻找它,因为它是我能想到的最接近"打印参考资料"的。
默认实现(如果它没有被覆盖)会将对象打印为类似的东西
Integer i = 95;
System.out.println(i.getClass().getName() + "@" + Integer.toHexString(i.hashCode()));
//java.lang.Integer@5f
在整数的情况下,hashCode
值与基础值相同。