如果我要编写自己的自定义注释(例如@ Test1,@ Test2)并使用以下代码
public class test {
@Test1("xxxx")
@Test2("xxxx")
public static void main(String[] args){
System.out.println("Args");
}
}
我想确保如果实施@ Test1,则不能像上面那样使用@ Test2注释。
如果是这样的话,我如何编写一个可以处理源代码的验证器/解析器,以确保这两个注释不会一起写入?
例如,编译时会返回一条错误消息,指出此错误
答案 0 :(得分:1)
如果没有单独的工具(如Maven),在编译时就无法轻松完成,但很容易在运行时使用标准Java进行验证。
对于运行时解决方案,您需要从您的类中获取所有方法,然后迭代它们以检查您的注释。如果两者都有,则抛出错误。
private static void validateMethodAnnotations(Class<?> myClass){
for (Method method : myClass.getMethods()){
Test1 test1 = method.getAnnotation(Test1.class);
Test2 test2 = method.getAnnotation(Test2.class);
if (test1 != null && test2 != null){
// both annotations
}
}
}
答案 1 :(得分:1)
Java有这个东西的API:
JSR-269:“Pluggable Annotation Processing API”,2006
Google支持这些条款或“APT”。
基本上,它定义了编译器插件的API。这些插件可以配置为在正常构建过程中运行,也可以在Eclipse中运行。
这些插件可以做有趣的事情 - 例如评估注释,编写新的源文件或二进制文件。在您的情况下,您只需要发出一些错误消息(也由API提供)。
由于这些插件是在编译时进行评估的,因此注释不需要@Retention(CLASS)
或@Retention(RUNTIME)
,SOURCE
也可以。这对你的用例来说是否重要 - 我不知道。
但要注意 - 内部类型系统......有趣(充其量)。