Проверка аннотации определенного типа

Я использую отражение, чтобы увидеть, является ли аннотация, прикрепленная к свойству класса, определенного типа. То, что я делаю:

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

Который поражает меня как маленький kludgey, потому что он полагается на строку, которая является полностью квалифицированным именем класса. Если пространство имен изменится в будущем, это может привести к незначительным ошибкам.

Я хотел бы сделать:

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

Но javax.validation.Valid является абстрактным классом и не может быть инстанцирован. Есть ли способ имитировать instanceof (или в основном использовать isInstance) для интерфейса или абстрактного класса?

Ответы

Ответ 1

Вы просто ищете

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

?

Ответ 2

Или даже проще:

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

Ответ 3

Только для полноты, другая возможность

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

Ответ 4

Хорошо, наверное, я должен был сделать немного больше исследований, прежде чем публиковать вопрос. Я обнаружил, что могу использовать Class.isAssignableFrom(Class<?> cls):

import javax.validation.Valid;

if(Valid.class.isAssignableFrom(annotation.annotationType())) {
   ...
}

Это, похоже, выполняет эту работу. Я не уверен, есть ли какие-либо оговорки в использовании этого подхода.

Ответ 5

Поскольку аннотация является просто классом, вы можете просто использовать == compare:

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