【问题标题】:Checking if an annotation is of a specific type检查注解是否属于特定类型
【发布时间】:2011-03-21 20:57:39
【问题描述】:

我正在使用反射来查看附加到类属性的注释是否属于特定类型。目前我正在做:

if("javax.validation.Valid".equals(annotation.annotationType().getName())) {
   ...
}

这让我觉得有点笨拙,因为它依赖于一个完全限定类名的字符串。如果将来命名空间发生变化,这可能会导致细微的错误。

我想做:

if(Class.forName(annotation.annotationType().getName()).isInstance(
     new javax.validation.Valid()
)) {
   ...
}

但是javax.validation.Valid是一个抽象类,不能实例化。有没有办法针对接口或抽象类模拟instanceof(或基本上使用isInstance)?

【问题讨论】:

    标签: java reflection annotations instanceof isinstance


    【解决方案1】:

    甚至更简单:

    if (annotation instanceof Valid) { /* ... */ }
    

    【讨论】:

    • 我认为这个答案应该更高。如果您只想查看 Annotation 实例是否属于特定类型,只需使用 instanceOf,因为它比使用 annotation.annotationType().equals(javax.validation.Valid.class) 更直接
    • 只是一个观察,如果程序员忘记用@Retention(value=RUNTIME)注释@interface,这总是错误的
    【解决方案2】:

    为了完整起见,另一种可能性是

    if (this.getClass().isAnnotationPresent(MyCustomAnnotation.class)) {
    

    【讨论】:

      【解决方案3】:

      由于注解只是一个类,您可以简单地使用 == 比较:

      if (annotation.annotationType() == Valid.class) { /* ... */ }
      

      【讨论】:

        【解决方案4】:

        你只是在寻找

        if (annotation.annotationType().equals(javax.validation.Valid.class)){}
        

        ?

        【讨论】:

          【解决方案5】:

          好的,我想我应该在发布问题之前做更多的研究。我发现我可以使用Class.isAssignableFrom(Class<?> cls)

          import javax.validation.Valid;
          
          if(Valid.class.isAssignableFrom(annotation.annotationType())) {
             ...
          }
          

          这似乎完成了这项工作。不过,我不确定使用这种方法是否有任何注意事项。

          【讨论】:

          • 这有点矫枉过正,因为无论如何扩展注释都是非法的。不知道与普通 equals 相比是否有任何有意义的性能损失。
          • @Affe 看到了您的解决方案 - 我不知道您可以简单地在 .class 上执行 .equals==!感谢那。我的印象是使用.class 只是比较Class 对象而不是实际类型。
          • 这个类实际上是一个单例。保证每个类加载器对于给定类型只有一个 Class 对象的实例,因此您可以在 java 中以这种方式比较它们。
          猜你喜欢
          • 1970-01-01
          • 2020-06-15
          • 1970-01-01
          • 1970-01-01
          • 2013-09-12
          • 1970-01-01
          • 2015-02-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多