检查注释是否属于特定类型

Viv*_*ath 17 java reflection annotations instanceof isinstance

我使用反射来看看是否被连接到一个类的属性的注释,是一种特定类型的.目前我在做:

if("javax.validation.Valid".equals(annotation.annotationType().getName())) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

我想要做:

if(Class.forName(annotation.annotationType().getName()).isInstance(
     new javax.validation.Valid()
)) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

Aff*_*ffe 43

你在寻找吗?

if (annotation.annotationType().equals(javax.validation.Valid.class)){}
Run Code Online (Sandbox Code Playgroud)


yur*_*rez 20

甚至更简单:

if (annotation instanceof Valid) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

  • 只是一个观察,如果程序员忘记使用`@Retention(value = RUNTIME)来注释@interface,那么这将永远是假的. (7认同)

sle*_*ske 11

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

if (this.getClass().isAnnotationPresent(MyCustomAnnotation.class)) {
Run Code Online (Sandbox Code Playgroud)


Viv*_*ath 5

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

import javax.validation.Valid;

if(Valid.class.isAssignableFrom(annotation.annotationType())) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

这似乎可以完成工作。不过,我不确定使用此方法是否有任何警告。