Я только что слышал об AspectJ, и это не выглядит слишком легко понять, поэтому я хочу знать заранее, если он (или что-то еще) поможет мне с моей проблемой или нет.AspectJ/Генерировать методы, используя отражение времени компиляции
У меня есть куча простых классов POJO и вы хотите написать для них двоичные сериализаторы, но без написания методов записи/чтения вручную для каждого класса. Я мог бы сделать это с помощью рефлексии, но это повлияет на производительность во время выполнения. Я считаю, что мне нужно что-то похожее на макросы в Scala с отражением во времени компиляции и квазикварталами.
Update: Я не могу использовать любой сериализации доступны, потому что у меня есть пользовательский двоичный протокол, который я не могу изменить (онлайн-игры)
Update 2:
Пример POJO с его read
, write
и некоторыми вспомогательными методами. Не окончательная версия, возможно, могут быть некоторые аннотации, например, но общая структура должна быть одинаковой. Я также опускал наследование для простоты, в действительности LoginPacket расширяет класс CommandPacket, который, в свою очередь, расширяет класс пакета.
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
@ Demyx97, см. Update please – bobby
Вы заинтересованы в ответе, который мог бы достоверно генерировать код, используя только источник (время предварительной компиляции)? –