【问题标题】:Validating Custom Java Annotation验证自定义 Java 注释
【发布时间】:2013-06-07 15:58:32
【问题描述】:

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

public class test {

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

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

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

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

【问题讨论】:

  • 不确定我明白了...你想让两者互斥吗?
  • 感谢您的帮助,但我得到了答案:D

标签: java validation annotations


【解决方案1】:

Java 为这些东西提供了一个 API:

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

Google 搜索这些术语或“APT”。

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

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

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

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

【讨论】:

  • 谢谢你,我会看看这个:D
【解决方案2】:

如果没有单独的工具(例如 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
        }
    }
}

【讨论】:

  • 虽然您可以将其放入 Maven/Gradle/etc 验证插件并在打包过程中收到错误消息..
  • 没错,我知道有外部工具可以做到这一点。我只是提供了一个纯标准的 java 解决方案(注意它在运行时工作)
  • 谢谢,我也试试这个:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 2018-10-25
  • 2015-02-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多