如何强制Java子类定义注释?

如果一个类定义了一个注释,是否有可能强制其子类定义相同的注释?

例如,我们有一个简单的类/子类对,它们共享@Author @interface. 我想做的是强制每个进一步的子类定义相同的@Author注释,防止在@Author某个地方出现RuntimeException

TestClass.java:

 import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @interface Author { String name(); } @Author( name = "foo" ) public abstract class TestClass { public static String getInfo( Class c ) { return c.getAnnotation( Author.class ).name(); } public static void main( String[] args ) { System.out.println( "The test class was written by " + getInfo( TestClass.class ) ); System.out.println( "The test subclass was written by " + getInfo( TestSubClass.class ) ); } } 

TestSubClass.java:

 @Author( name = "bar" ) public abstract class TestSubClass extends TestClass {} 

我知道我可以在运行时枚举所有注释并检查缺少的@Author ,但我真的很想在编译时执行此操作,如果可能的话。

你可以在编译时使用JSR 269做到这一点。 请参阅: http : //today.java.net/pub/a/today/2006/06/29/validate-java-ee-annotations-with-annotation-processors.html#pluggable-annotation-processing-api

我很确定在编译时这是不可能的。

但是,对于“单元”测试来说,这是一项显而易见的任务。 如果你想要强制执行这样的约定,但是使用编译器很难或不可能检查,“单元” – 测试是一种检查它们的简单方法。

另一种可能性是在静态分析器中实现自定义规则。 这里有很多选择。

(我把单位放在吓唬报价中,因为这实际上是对约定的测试,而不是特定单位的测试。但它应该与你的unit testing一起运行)。

您可以在超类上使用@Inherited创建一个Annotation(例如@EnforceAuthor),并使用编译器注释(自Java 1.6起)在编译时赶上。 然后你有一个子类的引用,可以检查是否缺少另一个Annotation(例如@Author))。 这将允许取消编译错误消息。