如何验证注释仅在某些类上使用?

时间:2018-06-27 04:31:34

标签: java annotations

说我有一个注释@Annotate和一个类A。如何检查@Annotate是否仅用于类A及其子类(可能在编译时)?

所以,如果我们有:

/* Example 1 */

public class A {

}  

public class B extends A {

}

public class C {

}

如何检查A是否可以注释类B和类@Annotate,但是不允许类C(可能会引起编译错误)。 / p>


如果我们决定在编译时进行检查:

/* Example 2 */

public class A {

}  

@Annotate
public class B extends A {

}

示例2 不会引发编译时错误,因为@Annotate的子类上使用了A。但是,示例3 会引发编译错误,因为@Annotate的子类上未使用A

/* Example 3 */

@Annotate
public class C {

}

但是,无论如何都不必在编译时进行检查。我个人认为这样做很有意义。

2 个答案:

答案 0 :(得分:1)

您应该写一个annotation processor。注释处理器可以生成新的Java文件,并针对您的情况更相关地发出编译时警告。

您将在编译时通过像这样运行Java编译器来调用它:javac -processor MyProcessor MyFile.java。如果常规javac或您的注释处理器发出任何警告,则编译将失败。

您的注释处理器的逻辑特定于您的@Annotate注释,并且很简单:仅在子类A的类上允许注释。除了我上面链接的Oracle文档之外,网络上还有许多有关如何编写注释处理器的教程。

答案 1 :(得分:1)

您可以使用我的enter image description here

只需在注释上添加注释@CheckType

@Target(TYPE)
@CheckType(value = A.class, type = Type.EXTEND_ALL)
public @interface OnlyOnA {
}

现在它可以检查它是否在A或其子类上进行了注释。

它将引发编译错误

  • 蚀快照

checker-framework

  • maven快照

enter image description here