我有一个子类,它需要一个Annotation,它在Parent类中声明被删除。这样做的最佳方式是什么?
public class Parent
@MyAnnoation
String foobar;
}
public class Child extends Parent {
//here I only want to remove the @MyAnnotation from String foobar;
}
我想避免的是“覆盖”成员
public class Child extends Parent {
String foobar;
}
因为它有几个缺点(因为它“覆盖”底层父成员= this.foobar可能与super.foobar不同)...
1。)是否有一种简单的方法可以从子类(此处是Child)的父类中删除注释?
2。)删除子类注释的官方方法是什么?
非常感谢!马库斯
答案 0 :(得分:4)
如果你想做这样的事情,你可能应该再看一下你的设计。
我认为如果有一种方法可以删除运行时注释而不推荐使用,那么因为您将删除类定义的一部分。就像删除成员访问修饰符一样。
这可能会对您的逻辑产生意外结果,因为其他代码可能依赖这些定义来做出运行时决策。
如果你需要在运行时修改类定义,那么这个类可能不应该首先以这种方式定义。
答案 1 :(得分:1)
据我所知,您无法删除注释。但这可能有所帮助:
并非所有注释都在运行时可用。因此,在这种情况下,显然没有理由删除它们。只有@Retention(RUNTIME)
的注释在运行时可用。 (例如,@Nullable
注释在运行时不可用,但@XmlElement
是。)。
仅针对课程级别的注释,还有另一件事需要考虑。并非所有注释都自动继承到子类。这仅适用于具有@Inherited
注释的注释。
通过重新声明不同的注释,可能会对某些注释产生矛盾。 (例如,@XmlAccessorType(FIELD)
的父类可以使用@XmlAccessorType(PUBLIC)
的子类。)
因此,删除是不可能的,但重新定义/替换是。 在实践中,这意味着可以删除某些注释的效果"将它们设置为默认值@MyAnnotation(NONE)
或@MyAnnotation(DEFAULT)
或@NotMyAnnotation
。因此,这意味着它实际上取决于您正在处理的注释类型。
还有一件事:即使您可以重新定义子类的注释,它仍然不会总是给出所需的效果。 (例如,在@XmlElement
的情况下,父方法上的注释有时在执行期间具有优先权。很高兴知道一些框架(例如持久性)支持替代xml绑定文件作为java类注释的替代方法。