gpt4 book ai didi

java - 反射和数组

转载 作者:行者123 更新时间:2023-12-02 05:53:25 25 4
gpt4 key购买 nike

我正在尝试编写一个灵活的类,它允许我使用 Java 中定义的类来解析二进制数据结构。

当我纯粹使用 int 变量时,我能够实现我想要的,但是一旦我继续使用 byte[] 之类的东西> 作为一种类型,我跌跌撞撞。请参阅下面的示例。

public class ReflectionTest {
public ReflectionTest(MappedByteBuffer buffer, int start) {
buffer.position(start);
Field[] fields = this.getClass().getDeclaredFields();
try {
for (Field field : fields) {
if (field.getType().toString().equals("int")) {
//Set the value of the int field
field.setInt(this, buffer.getInt());
} else if (field.getType().toString().equals("class [B")) {
//Set the value of the byte array...
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

public class ReflectionTest1 extends ReflectionTest {
public byte[] Signature = new byte[4];
public byte[] Version = new byte[4];
public int Time;

public ReflectionTest1(MappedByteBuffer buffer, int start) {
super(buffer,start);
}
}

public Main() {
try {
FileChannel channel = new RandomAccessFile("test.bin", "r").getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
buffer.order(ByteOrder.LITTLE_ENDIAN);
ReflectionTest1 test = new ReflectionTest1(buffer,0);
} catch (Exception e) {
e.printStackTrace();
}
}

我很困惑如何获取 ReflectionTest1 中定义的数组的长度(例如,Signature 的长度为 4),因此将正确数量的数据从提供的 MappedByteBuffer 读取到字段中。

这在 Java 中可能吗?我的理由是我有许多结构,其中一些结构有大量元素。我可以使用反射根据子类字段的类型和长度自动填充子类字段,而不是重复自己(对每个字段执行 getInt/get)。

有许多库提供类似的功能,但没有一个库能够提供我所需的灵 active (至少,从我能找到的来看)。

非常感谢任何帮助或见解! :)

最佳答案

要以反射方式访问数组,请使用 java.lang.reflect.Array .

您的代码应为:

 if (int.class.equals(field.getType()) 
{
...
}
else if (field.getType().isArray() && byte.class.equals(field.getType().getComponentType()))
{
...
}

假设您不想将整个缓冲区读入字节数组,那么您如何知道数组的大小将取决于您的序列化机制(这可能会使 switch 语句无效 - 它应该是替换为从缓冲区读取值的开关)。

一种常见的方法是先编写类型,然后控制如何解释接下来的内容。对于数组,接下来是长度,然后是数组内容。

老实说,您最好使用第三方库,例如 Google 的 Protocol Buffers ,它已经涵盖了这一点以及更多内容。

关于java - 反射和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23335528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com