我希望能够在Java中打印对象的“对象引用”以进行调试。 也就是说,为了确保对象在不同情况下是否相同。
问题在于,所涉及的类继承自另一个类,该类已覆盖了通常会给出对象标识符的toString()和hashCode()方法。
例如的情况是: 运行多线程应用程序时,在开发期间,我想检查所有线程是否使用同一资源对象实例。
我希望能够在Java中打印对象的“对象引用”以进行调试。 也就是说,为了确保对象在不同情况下是否相同。
问题在于,所涉及的类继承自另一个类,该类已覆盖了通常会给出对象标识符的toString()和hashCode()方法。
例如的情况是: 运行多线程应用程序时,在开发期间,我想检查所有线程是否使用同一资源对象实例。
你计划用它做什么(你想要做什么会影响你需要调用什么)。
hashCode
,根据JavaDocs的定义,如下所示:
尽可能合理,Object类定义的hashCode方法会为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来实现,但这种实现技术并非Java编程语言所必需)
所以如果你使用hashCode()
来查找它是否是存储在内存中的唯一对象,那么这并不是一个好办法。
System.identityHashCode
的功能如下:
无论给定对象的类是否覆盖hashCode()方法,返回与默认方法hashCode()返回的给定对象的哈希码相同的哈希码。null引用的哈希码为零。
就你所要做的而言,这听起来像是你想要的...但是,根据库的实现方式,你想要做什么可能并不安全。
这是我的解决方案:
Integer.toHexString(System.identityHashCode(object));
双等号==
会始终根据对象的身份标识进行检查,而不考虑对象对hashCode或equals方法的实现。当然,确保您比较的对象引用是volatile
(在1.5+的JVM中)。
如果您真的需要原始Object toString结果(尽管这并不是您示例用例的最佳解决方案),Commons Lang库有一个方法ObjectUtils.identityToString(Object)可以满足您的要求。从JavaDoc中得知:
public static java.lang.String identityToString(java.lang.Object object)
获取一个对象的 toString() 方法在该类没有自己的实现时默认返回的值。如果该对象为 null,则返回 null。 ObjectUtils.identityToString(null) = null
ObjectUtils.identityToString("") = "java.lang.String@1e23"
ObjectUtils.identityToString(Boolean.TRUE) = "java.lang.Boolean@7fa"
java.util.Objects
中想到了哪些方法?Objects.toString(o)
相当于调用 o.toString()
,并进行了空值检查,这似乎与此问题无关。 - amaidment为所有实例添加唯一的id,例如:
public interface Idable {
int id();
}
public class IdGenerator {
private static int id = 0;
public static synchronized int generate() { return id++; }
}
public abstract class AbstractSomething implements Idable {
private int id;
public AbstractSomething () {
this.id = IdGenerator.generate();
}
public int id() { return id; }
}
继承自AbstractSomething并查询此属性。在单个虚拟机内是安全的(假设没有使用类加载器绕过静态内容进行游戏操作)。
sun.misc.Unsafe
提供的本机原子内存操作。 - randersclass Test
{
public static void main(String args[])
{
String a="nikhil"; // it stores in String constant pool
String s=new String("nikhil"); //with new stores in heap
System.out.println(Integer.toHexString(System.identityHashCode(a)));
System.out.println(Integer.toHexString(System.identityHashCode(s)));
}
}