2

如果我要编写自己的自定义注释(例如@Test1、@Test2)并在下面的代码中使用

public class test {

    @Test1("xxxx")
    @Test2("xxxx")
    public static void main(String[] args){
        System.out.println("Args");
    }
}

而且我想确保如果实现了@Test1,则不能像上面那样使用@Test2注解。

如果是这样的话,我如何编写一个可以处理源代码的验证器/解析器,以确保这两个注释不写在一起?

例如,在编译时会返回一个错误信息,指出这个错误

4

2 回答 2

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
        }
    }
}
于 2013-06-07T16:07:04.367 回答
1

Java 有一个用于这些东西的 API:

JSR-269:“可插入注释处理 API”,2006

谷歌这些术语或“APT”。

基本上,这为编译器插件定义了一个 API。这些插件可以配置为在正常的构建过程中运行,也可以在 Eclipse 中运行。

这些插件可以做一些有趣的事情——例如评估注释、编写新的源文件或二进制文件。在您的情况下,您只需要发出一些错误消息(也由 API 提供)。

由于这些插件是在编译时进行评估的,因此注释不需要具有@Retention(CLASS)@Retention(RUNTIME),SOURCE就可以了。这对您的用例是否重要 - 我不知道。

但请注意 - 内部类型系统是……有趣的(充其量)。

于 2013-06-07T19:25:26.657 回答