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

时间:2014-12-13 16:09:25

标签: java reflection aspectj

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

我有一堆简单的POJO类,并希望为它们编写二进制序列化器,但不为每个类手动编写Write / Read方法。我可以在反射的帮助下完成,但这会影响运行时性能。我相信我需要类似于Scala中的Macroses的编译时反射和quasiquotes。

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

更新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);
    }
}

1 个答案:

答案 0 :(得分:1)

我认为您不需要使用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)