验证自定义Java注释

时间:2013-06-07 15:58:33

标签: java validation annotations

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

public class test {

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

我想确保如果实施@ Test1,则不能像上面那样使用@ Test2注释。

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

例如,编译时会返回一条错误消息,指出此错误

2 个答案:

答案 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也可以。这对你的用例来说是否重要 - 我不知道。

但要注意 - 内部类型系统......有趣(充其量)。