Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AspectJ/使用编译时反射生成方法_Java_Reflection_Aspectj - Fatal编程技术网

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

Java AspectJ/使用编译时反射生成方法,java,reflection,aspectj,Java,Reflection,Aspectj,我刚刚听说了AspectJ,它看起来不太容易理解,所以我想事先知道它(或其他任何东西)是否能帮助我解决问题 我有很多简单的POJO类,希望为它们编写二进制序列化程序,但不需要为每个类手工编写写/读方法。我本可以借助反射来实现这一点,但这会影响运行时性能。我相信我需要类似于Scala中的宏的东西,带有编译时反射和准iqueotes 更新: 我无法使用任何可用的序列化,因为我有无法修改的自定义二进制协议(在线游戏) 更新2: 示例POJO及其read、write和一些助手方法。不是最终版本,可能会有

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

我有很多简单的POJO类,希望为它们编写二进制序列化程序,但不需要为每个类手工编写写/读方法。我本可以借助反射来实现这一点,但这会影响运行时性能。我相信我需要类似于Scala中的宏的东西,带有编译时反射和准iqueotes

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

更新2:

示例POJO及其
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序列化也很慢。