Java AspectJ/使用编译时反射生成方法
我刚刚听说了AspectJ,它看起来不太容易理解,所以我想事先知道它(或其他任何东西)是否能帮助我解决问题 我有很多简单的POJO类,希望为它们编写二进制序列化程序,但不需要为每个类手工编写写/读方法。我本可以借助反射来实现这一点,但这会影响运行时性能。我相信我需要类似于Scala中的宏的东西,带有编译时反射和准iqueotes 更新: 我无法使用任何可用的序列化,因为我有无法修改的自定义二进制协议(在线游戏) 更新2: 示例POJO及其Java AspectJ/使用编译时反射生成方法,java,reflection,aspectj,Java,Reflection,Aspectj,我刚刚听说了AspectJ,它看起来不太容易理解,所以我想事先知道它(或其他任何东西)是否能帮助我解决问题 我有很多简单的POJO类,希望为它们编写二进制序列化程序,但不需要为每个类手工编写写/读方法。我本可以借助反射来实现这一点,但这会影响运行时性能。我相信我需要类似于Scala中的宏的东西,带有编译时反射和准iqueotes 更新: 我无法使用任何可用的序列化,因为我有无法修改的自定义二进制协议(在线游戏) 更新2: 示例POJO及其read、write和一些助手方法。不是最终版本,可能会有
read
、write
和一些助手方法。不是最终版本,可能会有一些注释,例如,但一般结构应该是相同的。为了简单起见,我还省略了继承,实际上LoginPacket扩展了CommandPacket类,而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使用
实现可序列化
,然后使用ObjectOutputStream
序列化对象
将对象写入文件的简单示例:
outputStream = new ObjectOutputStream(new FileOutputStream(filePath));
outputStream.writeObject(yourObject);
...
// do whatever else and close stream
类似问题:
您不能使用简单的Java序列化吗?这个问题不清楚,而且过于笼统。我会投票关闭它,除非你用一些代码更新它,显示你有什么样的POJO,结果应该是什么。如何手动编写序列化程序?只有这样,人们才能判断是否可以通过AspectJ或其他方式生成它。谢谢,现在需求更清楚了。我可以为您提供AspectJ解决方案,但为了动态确定属性类型,它还必须使用反射,您已经说过这对于您的目的来说太慢了。在这种情况下,可以使用一个框架,如(或者如果您有一个分布式场景,并且希望串行化网络通信),或者编写您自己的框架,例如,通过定义某种DSL,然后代码生成器可以使用它。然后为数据定义创建DSL,并从中生成类includig(de-)Serialiser。但是请注意,我不久前指导过的一个Scrum团队做到了这一点,要让所有角落的案例都能正常工作,比如嵌套数据对象、解决循环依赖关系等等,需要做大量的工作。祝你玩得开心!还有一个提示:AspectJ有一个新的特性,使您能够在注释处理器中动态生成方面代码。通过这种方式,您可以为每个数据类生成一个方面,并在构建过程的注释处理阶段通过反射定义读/写方法。在运行期间,将不会有更多的反射,并且可能会非常快。但是我还没有完全想清楚,这只是一个想法。对不起,我从一开始就没有提到这个。请参阅更新。Java序列化也很慢。