【问题标题】:Inheriting class annotations继承类注解
【发布时间】:2011-11-02 15:59:54
【问题描述】:

有没有办法让类继承超类的注解?

例如

@ApplicationException(rollback=true)
public abstract class AbstractBeanActionException extends Exception {
    /* method body is simply calls to super() */
}

public class OrderBeanException extends AbstractBeanActionException {
    /* does this class have to be annotated as well ? */
}

【问题讨论】:

    标签: java annotations ejb-3.0


    【解决方案1】:

    如果你自己定义你的注解类,那么你可以使用@Inherited元注解:

    表示一个注解类型是自动继承的。如果注解类型声明中存在 Inherited 元注解,并且用户在类声明中查询注解类型,并且类声明没有该类型的注解,则将自动查询该类的超类以获取注解类型。

    【讨论】:

    • 来自上述链接文档的重要警告:请注意,如果注释类型用于注释类以外的任何内容,则此元注释类型无效。另请注意,此元注释仅导致注释从超类继承;已实现接口上的注释无效。
    【解决方案2】:

    类注解不能被子类继承。

    你可以做的是在编译时“强制”子类使用注解:

    https://community.oracle.com/docs/DOC-983563

    【讨论】:

    • 注释处理器有点超出了这个特定更改的范围,但出于好奇,我会尝试一下。我对 java 类中缺乏继承感到更加困惑,因为我对注释的理解是它们几乎是编译时元数据。
    • 链接已损坏,这不是答案
    【解决方案3】:

    当一个类被标记了一个本身用 java.lang.annotation.Inherited 注释的注释时,您可以请求该类上的注释,而继承的注释应该显示在结果中。

    ApplicationException 未标记为继承。嗯嗯。

    【讨论】:

    • 见 JB Nizet 的类似答案,继承在 3.1 中添加
    【解决方案4】:

    注解不会被继承。但是使用注解的框架(在本例中为 EJB3)可以选择在类层次结构中导航以查看它是否存在于超类中。

    查看javadoc of this annotation:它有一个inherited 属性,准确地说,该属性指示此注释是否也应应用于子类。

    【讨论】:

    • 谢谢,至少我知道升级到 EJB 3.1 时会有所期待;)
    【解决方案5】:

    类注解不能被子类继承,但非私有非构造函数成员方法和字段上的注解会连同它们关联的方法/字段一起被继承。所以你可以尝试使用这些来达到预期的效果。

    【讨论】:

    • 作为我所追求的唯一类级别注释,为了使 AbstractBeanActionException 的所有子类导致回滚,我将对子类进行注释。
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2018-01-04
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多