【问题标题】:custom annotation parametrized inherit other annotation自定义注解参数化继承其他注解
【发布时间】:2019-10-25 10:56:47
【问题描述】:

我有一个参数化注释(在本例中为@MiTag1)。我想创建一个新的注释(@MiTag2),扩展@MiTag1和其他注释,我希望@MiTag1的值被@MiTag2的值“扩展”

在我的代码示例中,@MiTag2("bla") 必须与 @MiTag1("bla") 相同,但在 @MiTag2 中没有硬编码“bla”。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MiTag1 {

    /**
     * The resource key.
     *
     * @see Resources
     */
    String value();
}

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MiTag1(value = THIS.VALUE)
public @interface MiTag2 {

    /**
     * The resource key.
     *
     * @see Resources
     */
    String value();
}

【问题讨论】:

    标签: java inheritance annotations


    【解决方案1】:

    Java 不允许您从另一个注释扩展。这是设计使然,因为它会引入一个相当复杂的类型系统。这个问题已经详细回答here,但重要的部分是:

    为什么不支持注解子类型(其中一种注解类型 扩展另一个)?

    它使注解类型系统复杂化,并使其更加复杂 很难写出“具体的工具”。

    “特定工具”——查询已知注释类型的程序 任意外部程序。例如,存根生成器属于 这个类别。这些程序将读取带注释的类,而无需 将它们加载到虚拟机中,但会加载注释 接口。

    (来自pedromarce的原始答案)

    要绕过这个问题,您可以使用两个注解来注解您的目标类型 @MiTag1 @MiTag2 并将应该继承注解的默认值设置为父注解的值。

    此外,您可以使用组合而不是继承并将@MiTag2 类型的注释添加到@MiTag2

    【讨论】:

    • "... 将@MiTag2 类型的注释添加到@MiTag2"。你能举个例子吗?
    猜你喜欢
    • 2022-12-12
    • 2012-12-18
    • 2011-11-02
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2012-06-23
    • 2018-01-04
    相关资源
    最近更新 更多