覆盖java中的类签名

时间:2015-06-14 04:27:03

标签: java serialization hook

我在.jar文件(库文件)中有如下类:

class A{
//someimplementation
}

我想按照以下方式进入implements Serializable界面:

class A implements Serializable {
//the same implementation as present in classA
}

我不想反编译jar文件,更改类签名,然后在编译后再次存档。

有没有办法像写钩子来实现这一目标?请提供任何指示/建议。 我的最终目标是在不修改jar文件的情况下实现Serializable接口。

1 个答案:

答案 0 :(得分:1)

您可以使用序列化代理模式(Effective Java 2nd edition Item 78)

来实现此目的

关于模式的一些链接:

http://jtechies.blogspot.com/2012/07/item-78-consider-serialization-proxies.html

http://java.dzone.com/articles/serialization-proxy-pattern

Follow up: instance control in Java without enum

创建一个扩展ASerializable的新类。但是,为了避免序列化错误,因为A不可序列化,您需要创建一个SerializationProxy,它通过构造函数或工厂方法创建一个新实例,而不是显式设置外部字段的常规Java Serialization机制。任何构造函数。

public class MySerializableA extends A implements Serializable{
    private final Foo foo;
    private final Bar bar;
   ...

    private Object writeReplace() {
         return new SerializationProxy(this);
    }
    //this forces us to use the SerializationProxy
    private void readObject(ObjectInputStream stream) throws InvalidObjectException {
         throw new InvalidObjectException("Use Serialization Proxy instead.");
    }


   //this private inner class is what actually does our Serialization
   private static class SerializationProxy implements Serializable {
        private final Foo foo;
        private final Bar bar;
   ...

    public SerializationProxy(MySerializableA myA) {
        this.foo = myA.getFoo();
        this.bar = myA.getBar();
        ...//etc
    }

    private Object readResolve() {
        return new MySerializableA(foo, bar,...);
    }

}
} 

唯一的缺点是当您要序列化A时,您必须将其包装在MyA中。但是当反序列化时,转换为A将正常工作。