调试纯Java时获取OID



在Eclipse IDE(核心Java)中调试时,检查对象后面跟着一个id,例如:myObject=MyClass(id=123)

对于检测意外的对象更改,记录任何OID也会很有帮助。知道如何编写一个返回特定于对象的唯一ID的getOid()方法吗?它不需要是可序列化的,它只是在一次运行中使用。与hashCode()相反,OID必须是唯一的。此getOid()可以返回int、long、String或任何可打印的内容。提前感谢

我相信System.identityHashCode(Object x)就是您想要的。正如javadoc给出的,它打印出的值与对象默认hashCode()打印的值相同。这应该是唯一的,因为它通常是对象的内存地址。在这种情况下,您也可以使用默认的hashCode()。

您还可以使用java.util.Objects.hash(Object…values)重写hashCode()方法并传入对象的字段。这将为您验证对象的内部没有更改。

但是,您是否试图跟踪Eclipse定义的相同内部ID?我不是肯定的,但我怀疑这是Eclipse调试器内部分配的,对您来说不可用。

好的,我通过所有构造函数中使用的序列生成器"OIDGenerator"解决了这个问题:

公共类OIDGenerator{

private static OIDGenerator mOIDGen;
private static long mOID;
/**
 * Singleton Constructor
 */
private OIDGenerator() {
    mOID = 0;
}
public static long longNext() {
    if( mOIDGen == null) {
        mOIDGen = new OIDGenerator();    // => init 0
    }
    return ++mOID;
}
public static String next() {
    return new StringBuffer( "@").append( String.valueOf( longNext())).toString();
}

}

所有类中的成员变量:

private final transient String mOID;

在他们的构造函数中:

mOID = OIDGenerator.next();

提供方法:

@Override
public String getOID() {
    return mOID;
}

没有OIDGenerator构造函数的更简单的版本:

公共类OIDGenerator{

private static long sOID = 0;
public static long longNext() {
    return ++sOID;
}
public static String next() {
    return new StringBuffer( "@").append( String.valueOf( longNext())).toString();
}

}

但请记住,由于存在静态变量,两个版本都不能在服务器集群中使用。

最新更新