删除子类中的注释?

时间:2011-06-24 12:03:14

标签: java annotations

我有一个子类,它需要一个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。)删除子类注释的官方方法是什么?

非常感谢!马库斯

2 个答案:

答案 0 :(得分:4)

如果你想做这样的事情,你可能应该再看一下你的设计。

我认为如果有一种方法可以删除运行时注释而不推荐使用,那么因为您将删除类定义的一部分。就像删除成员访问修饰符一样。

这可能会对您的逻辑产生意外结果,因为其他代码可能依赖这些定义来做出运行时决策。

如果你需要在运行时修改类定义,那么这个类可能不应该首先以这种方式定义。

答案 1 :(得分:1)

据我所知,您无法删除注释。但这可能有所帮助:

  1. 并非所有注释都在运行时可用。因此,在这种情况下,显然没有理由删除它们。只有@Retention(RUNTIME)的注释在运行时可用。 (例如,@Nullable注释在运行时不可用,但@XmlElement是。)。

  2. 仅针对课程级别的注释,还有另一件事需要考虑。并非所有注释都自动继承到子类。这仅适用于具有@Inherited注释的注释。

  3. 通过重新声明不同的注释,可能会对某些注释产生矛盾。 (例如,@XmlAccessorType(FIELD)的父类可以使用@XmlAccessorType(PUBLIC)的子类。)

  4. 因此,删除是不可能的,但重新定义/替换是。 在实践中,这意味着可以删除某些注释的效果"将它们设置为默认值@MyAnnotation(NONE)@MyAnnotation(DEFAULT)@NotMyAnnotation因此,这意味着它实际上取决于您正在处理的注释类型。

    还有一件事:即使您可以重新定义子类的注释,它仍然不会总是给出所需的效果。 (例如,在@XmlElement的情况下,父方法上的注释有时在执行期间具有优先权。很高兴知道一些框架(例如持久性)支持替代xml绑定文件作为java类注释的替代方法。