gpt4 book ai didi

java - AspectJ/使用编译时反射生成方法

转载 作者:行者123 更新时间:2023-11-30 11:11:21 25 4
gpt4 key购买 nike

我刚听说 AspectJ,它看起来不太容易理解,所以我想事先知道它(或其他任何东西)是否能帮助我解决我的问题。

我有一堆简单的 POJO 类,想为它们编写二进制序列化器,但不想为每个类手动编写 Write/Read 方法。我本可以在反射的帮助下这样做,但这会影响运行时性能。我相信我需要类似于 Scala 中带有编译时反射和准引号的 Macroses 的东西。

更新:我无法使用任何可用的序列化,因为我有无法修改的自定义二进制协议(protocol)(在线游戏)

更新 2:

示例 POJO 及其 readwrite 和一些辅助方法。不是最终版本,可能会有一些注释,例如,但总体结构应该是相同的。为了简单起见,我还省略了继承,实际上 LoginPacket 扩展了 CommandPacket 类,后者又扩展了 Packet 类。

public class LoginPacket {
public short length;
public int sessionId;
public short command;
public short error;
public String reason;

private String getString(ByteBuffer data) {
short length = data.getShort();
byte[] stringData = new byte[length];
data.get(stringData);
return new String(stringData, "UTF-8");
}

private void putString(ByteBuffer data, String someString) {
data.putShort(someString.length());
byte[] stringData = someString.getBytes("UTF-8");
data.put(stringData);
}

public static LoginPacket read(ByteBuffer data) {
LoginPacker loginPacket = new LoginPacket();
loginPacket.length = data.getShort();
loginPacket.sessionId = data.getInt();
loginPacket.command = data.getShort();
loginPacket.error = data.getShort();
loginPacket.reason = getString(data);
return loginPacket;
}

public void write(ByteBuffer data) {
data.putShort(this.length);
data.putInt(this.sessionId);
data.putShort(this.command);
data.putShort(this.error);
putString(data, this.reason);
}
}

最佳答案

我认为您不需要使用 AspectJ 来修改您的类。我看不出使用编译团队编织会增加什么好处。我建议让您的 POJO 使用 implements Serializable,然后使用 ObjectOutputStream 序列化您的对象。

一个将对象写入文件的简单示例:

outputStream = new ObjectOutputStream(new FileOutputStream(filePath)); 
outputStream.writeObject(yourObject);
...
// do whatever else and close stream

类似问题:

  1. Saving to binary/serialization java
  2. Best way to store data for your game? (Images, maps, and such)

关于java - AspectJ/使用编译时反射生成方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27460873/

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