鉴于 C 中的以下声明,我可以这样写
char tab[64];
(*(uint32_t*)(tab[0]));
换句话说,应用这种类型的演员表(*(uint32_t*)
有没有另一种方法可以在java中实现这个来获取标签的地址?
非常感谢
Java 语言不支持使用指针(算术等)的直接操作。因此,让开发人员直接使用指针是不合理的。
有没有另一种方法可以在java中实现这个来获取标签的地址?
不,那里没有。
在 Java 中 along[]
和 aint[]
是根本不同的类型,你不能假装一个是另一个,反之亦然。
简单的解决方案是使用移位和掩码来提取各个long
值的高 32 位和低 32 位部分。
另一种选择可能是将 long 数组包装在 a 中LongBuffer
,然后创建它的IntegerBuffer
视图。但这(IMO)很麻烦,实际上只是隐藏了在幕后进行的转移/掩蔽。
评论指出,问题实际上是将字节数组视为指针数组。
这也不可能......而且没有明智的解决方法。标准 Java 不允许您将位模式转换为指针,反之亦然。(您可以使用一些技巧来做到这一点,但它们从根本上是不安全的,如果您没有完全正确地使用它们,它们很可能会导致您的 JVM 崩溃。)
无论您想要实现什么,您都应该找到一种不同的方式来用 Java 对其进行编码。
您需要使用移位和掩码构造 32 位 int。
Java 中的引用不像 C 中的指针那样是被动的。对象的地址可以随时更改,因此如果 JVM 不知道值是引用,它就无法正确更新它。
从字面上回答您的问题,您可以使用 Unsafe 类来执行此操作,但它仅在您对对象在内存中的布局感兴趣时才有用。更改这些值可能会导致 JVM 随机崩溃。
有没有另一种方法可以在java中实现这个来获取标签的地址?
如果您查看为什么要尝试这样做,您可能会发现在 Java 中解决方案完全不同,根本不需要指针。