我目前正在为Java 1.7构建一个本机JVMTI代理.问题是我需要索引有关特定Java对象实例的一些数据.所以我的问题是我可以使用jobject类型的值作为对象的实例ID来检索我的索引数据吗?
我已经查找了有关jobject类型的语义的任何信息.它是Object的内存位置的指针吗?它是一个堆栈指针地址吗?它是JVM内部结构的地址吗?所以我无法弄清楚jobject的值是否是Java对象生命中唯一且不可变的.
谢谢你的帮助.
编辑
根据JNI在这里找到的规范,jobject似乎是Object实例的指针.
当您说“作业类型的值”时,我猜您的意思是 toString 返回的值。如果你看一下 java doc 它指出:
Object 类的 toString 方法返回一个字符串,该字符串由对象所属的类的名称、at 符号“@”以及对象哈希码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:
Run Code Online (Sandbox Code Playgroud)getClass().getName() + '@' + Integer.toHexString(hashCode())
如果您查看hashCode方法的 Java 文档,它会指出:
每当在 Java 应用程序执行期间对同一对象多次调用 hashCode 方法时,它必须始终返回相同的整数
并且
在相当实用的情况下,Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但 JavaTM 编程语言不需要这种实现技术。)
更新:响应 Ryan 的评论:即使 hashcode 方法被重写,System.identityHashCode也会为您提供原始哈希码。然而,评论指出它并不是真正独特。
所以我想你的问题的答案是肯定的,它是不可变的,而且很可能是唯一的,但你应该阅读 JVM 的文档或源代码。