Как получить настоящую аннотацию вместо прокси из ConstraintDescriptor::getAnnotation? (javax.валидация Apache Bval)

Я пытаюсь получить ссылку на объект Class для аннотации, которая вызвала ConstraintViolation в пакете javax.validation (реализация Apache Bval).

Получив несколько ConstraintViolations, я передаю их в следующую функцию:

private Class<?> getConstraintAnnotation(final ConstraintViolation<?> constraintViolation) {
    return constraintViolation
        .getConstraintDescriptor()
        .getAnnotation()
        .getClass();
  }

И это возвращает объект класса, чьи getName(), getCanonicalName() и getTypeName() возвращают «java.lang.reflect.Proxy».

Как ни странно, метод toString() объекта Class возвращает "класс com.sun.proxy.$Proxy10".

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


person A Frayed Knot    schedule 24.07.2018    source источник


Ответы (1)


Аннотация Java реализована Proxy. Proxy действительно является аннотацией действительно. Вы должны использовать Annotation.annotationType, а не Object.getClass, чтобы получить реальный класс аннотаций.

person Dean Xu    schedule 24.07.2018