Java中是否有类似于<;重新解释铸件>;在C++;

Java中是否有类似于<;重新解释铸件>;在C++;,java,Java,我在我的函数消息数组中得到字节和对象类型,我需要从字节还原对象。在爪哇有C++中的任何类型吗?< P>不,你可以使用。< /P> < P>不,你需要序列化你的对象。 如果您的对象数据预期可以在其他语言中读取,则这可能没有用处。在Java中,没有办法拥有任意字节块,然后告诉编译器“您需要将其视为X类型的对象” 您想“还原到对象中”的字节最初是如何创建的 Java有一种序列化机制,可以将对象转换为字节流,反之亦然。我不确定您在这里要问什么,但Java中的每个对象(包括数组)都有与之相关的运行时类型

我在我的函数消息数组中得到字节和对象类型,我需要从字节还原对象。在爪哇有C++中的任何类型吗?

< P>不,你可以使用。< /P> < P>不,你需要序列化你的对象。


如果您的对象数据预期可以在其他语言中读取,则这可能没有用处。

在Java中,没有办法拥有任意字节块,然后告诉编译器“您需要将其视为X类型的对象”

您想“还原到对象中”的字节最初是如何创建的


Java有一种序列化机制,可以将对象转换为字节流,反之亦然。

我不确定您在这里要问什么,但Java中的每个对象(包括数组)都有与之相关的运行时类型信息。因此,当您将对象强制转换为其他类型时,如果新类型不匹配,将立即抛出异常。这与C/C++非常不同,在C/C++中,您可以告诉编译器将内存块视为您想要的任何对象


如果您正在寻找将任意字节集转换为对象的代码,或者相反,则需要使用不同的方法,使用内置的序列化功能,或者滚动您自己的转换代码。

以下是实现所需功能的方法

public static Object toObjectFromByteArray(byte[] byteArr) {
        if (byteArr == null) {
            return null;
        }

        Object resultObj = null;
        ByteArrayInputStream bin = null;
        ObjectInputStream ooin = null;
        try {
            bin = new ByteArrayInputStream(byteArr);
            ooin = new ObjectInputStream(bin);
            resultObj = ooin.readObject();
        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
        finally {
            try {
                if (ooin != null) {
                    ooin.close();
                }
                if (bin != null) {
                    bin.close();
                }
            }
            catch (IOException ex1) {
                ex1.printStackTrace();
            }

        }
        return resultObj;
    }

    public static byte[] toByteArray(Object obj) {
        ByteArrayOutputStream barr = null;
        ObjectOutputStream oout = null;
        byte[] bytearr = null;
        try {
            byte[] b2 = null;
            barr = new ByteArrayOutputStream(10000);
            oout = new ObjectOutputStream(barr);
            oout.writeObject(obj);
            oout.flush();
            oout.close();
            bytearr = barr.toByteArray();

        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
        finally {
            try {
                if (oout != null) {
                    oout.close();
                }
                if (barr != null) {
                    barr.close();
                }
            }
            catch (IOException ex1) {
                ex1.printStackTrace();
            }
        }
        return bytearr;
    }

reinterpret\u cast
可以在Java中进行相当程度的模拟,但不能直接反序列化整个对象。正如其他人所建议的那样,Java的内置序列化机制或其他第三方序列化库将是您的朋友,除非您自己能够在发送端将对象分解为更简单的类型


至于Java是否有一个等价于reinterpret\u cast的特定问题,答案是部分肯定的。如果您试图从二进制数据流中读取原语,
ByteBuffer
是您的朋友。将它包装在一个字节数组中,告诉它数据是little endian还是big endian,然后使用它的各种方法对数据进行解码。这可以用来模拟各种C++代码> RealTytCase< /Cord>从字节转换为32位整数或浮点或任何东西。

< P>如果你真的想取一块内存,并重新解释它是java对象,你可以通过<代码> Sun。MISC。 您需要迭代对象的类/类型,找到需要设置的所有有效字段,从堆外内存缓冲区中读取它们的特定类型,并通过反射进行设置

这不是我推荐的,使用其他序列化机制将是一个更好的选择

编辑:可能是这样的:

类测试{
int x;
int-y;
}
公共静态void main(字符串[]args)引发异常{
final Unsafe=Unsafe.getUnsafe();
最终整数计数=2;
最终长地址=不安全的.allocateMemory(Integer.BYTES*计数);
对于(int i=0;i

当然,您可以轻松地将这些原语重新解释为任何内容。我甚至不需要
不安全的输入
,但显然我需要根据
测试的输入

,谢谢@Hubbitus。我已经切换到另一个链接,它也解释了序列化。