Проверка, является ли аннотация определенного типа - PullRequest
17 голосов
/ 28 июля 2010

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

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

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

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

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

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

Ответы [ 5 ]

43 голосов
/ 28 июля 2010

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

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

?

19 голосов
/ 10 мая 2011

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

if (annotation instanceof Valid) { /* ... */ }
10 голосов
/ 21 декабря 2010

Для полноты картины есть еще одна возможность:

if (this.getClass().isAnnotationPresent(MyCustomAnnotation.class)) {
5 голосов
/ 28 июля 2010

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

import javax.validation.Valid;

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

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

2 голосов
/ 28 июля 2010

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

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