说我有一个注释@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 {
}
但是,无论如何都不必在编译时进行检查。我个人认为这样做很有意义。
答案 0 :(得分:1)
您应该写一个annotation processor。注释处理器可以生成新的Java文件,并针对您的情况更相关地发出编译时警告。
您将在编译时通过像这样运行Java编译器来调用它:javac -processor MyProcessor MyFile.java
。如果常规javac或您的注释处理器发出任何警告,则编译将失败。
您的注释处理器的逻辑特定于您的@Annotate
注释,并且很简单:仅在子类A
的类上允许注释。除了我上面链接的Oracle文档之外,网络上还有许多有关如何编写注释处理器的教程。
答案 1 :(得分:1)
只需在注释上添加注释@CheckType
@Target(TYPE)
@CheckType(value = A.class, type = Type.EXTEND_ALL)
public @interface OnlyOnA {
}
现在它可以检查它是否在A或其子类上进行了注释。
它将引发编译错误