我在.jar
文件(库文件)中有如下类:
class A{
//someimplementation
}
我想按照以下方式进入implements Serializable
界面:
class A implements Serializable {
//the same implementation as present in classA
}
我不想反编译jar文件,更改类签名,然后在编译后再次存档。
有没有办法像写钩子来实现这一目标?请提供任何指示/建议。 我的最终目标是在不修改jar文件的情况下实现Serializable接口。
答案 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
创建一个扩展A
且Serializable
的新类。但是,为了避免序列化错误,因为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
将正常工作。