可以构建一个基于运行时注释以不同方式序列化的类。
public class Foo implements Externalizable {
public void writeExternal(ObjectOutputStream out) throws IOException {
if (getClass().getAnnotations().length == 0) {
out.writeObject("no");
} else {
out.writeObject("yes");
}
}
public void readExternal(ObjectInputStream in) throws IOException { ... }
}
然后具有运行时注释的子类的实例将与父类不同地序列化,尽管事实上writeExternal
是共享的。
@Retention(RetentionPolicy.RUNTIME)
@interface ARuntimeAnnotation {}
@ARuntimeAnnotation
public class SubFoo extends Foo {}
RetentionPolicy.RUNTIME
发生这种情况是因为您引用的“可以反过来影响正在运行的程序的语义”的注释。