调试普通Java时获取OID

时间:2015-04-07 17:26:33

标签: java debugging oid

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

为了检测非预期的对象更改,记录任何OID也会有所帮助。 知道如何编写返回对象特定唯一ID的getOid()方法吗? 它不需要是可序列化的,它只是在一次运行中使用。 与hashCode()相比,OID必须是唯一的。 这个getOid()可以返回int,long,String或其他任何可打印的东西。 提前谢谢

3 个答案:

答案 0 :(得分:1)

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

您还可以使用java.util.Objects.hash(Object ... values)覆盖hashCode()方法并传入对象的字段。这将验证您对象的内部结构是否正在发生变化。

但是,您是否尝试跟踪Eclipse定义的相同内部ID?我不是肯定的,但我怀疑它是由Eclipse调试器在内部分配的,并且对您无法使用。

答案 1 :(得分:0)

好的,我通过所有构造函数中使用的序列生成器'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;
}

答案 2 :(得分:0)

没有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();
}

}

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