我剛剛聽說AspectJ,它看起來不太容易理解,所以我想事先知道它是否會幫助我解決問題。AspectJ /使用編譯時反射生成方法
我有一堆簡單的POJO類,希望爲它們編寫二進制序列化程序,但不用手寫每個類的Write/Read方法。我可以在反射的幫助下完成,但這會影響運行時性能。我相信我需要一些類似於Scala中的Macroses的編譯時反射和quasiquotes。
更新: 我無法使用任何可用的序列化,因爲我有自定義的二進制協議,我不能修改(在線遊戲)
更新2:
例POJO與它的read
,write
和一些輔助方法。例如,不是最終版本,可能會有一些註釋,但一般結構應該是相同的。爲簡單起見,我也省略了繼承,實際上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);
}
}
你不能夠使用簡單的Java序列化? – Nikolai97 2014-12-13 18:27:21
@ Demyx97,請參閱更新請求 – bobby 2014-12-13 19:49:33
您是否對僅使用源代碼(預編譯時間)可靠地生成代碼的答案感興趣? – 2014-12-13 21:28:50