自定义注释的参数化继承其他注释

问题描述 投票:0回答:1

我有一个参数化注释(在这种情况下为@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个回答
0
投票

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

为什么不支持注释子类型(一种注释类型延伸另一个)?

它使注释类型系统复杂化,并使它更多很难写“特定工具”。

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

(来自[[pedromarce的原始答案)

要避开此问题,您可以使用两个注释来注释目标类型@MiTag1 @MiTag2并将

应该继承

批注的默认值设置为父注释的值。此外,您可以在继承上使用合成,并在@MiTag2中添加类型为@MiTag2的注释。
© www.soinside.com 2019 - 2024. All rights reserved.