как эмулировать getDeclaredAnnotation в javax.lang.model.element TypeElement - PullRequest
0 голосов
/ 23 января 2019

Я пишу обработчик аннотаций, и у меня есть аннотация "a" с @Inherited.Это означает, что для любого элемента "e", который представляет класс "c", который расширяет класс, в котором фактически присутствует моя аннотация, я получу e.getAnnotation(a.class) != null, чтобы быть верным - и хорошо, это ожидание.

Мне также удалось определить самый высокий класс в иерархии, в котором фактически присутствует моя аннотация, по:

private TypeElement getClassWhereAnnotationIsActuallyDefined(TypeElement e){
    if(e.getAnnotation(a.class) == null){
        throw new IllegalArgumentException("method called on type: "+e.getQualifiedName().toString()+" which is not annotated @a !");
    }
    TypeElement superE = (TypeElement) processingEnv.getTypeUtils().asElement(e.getSuperclass());
    if(superE.getAnnotation(Secured.class) == null){
        return e;
    }else{
        return getClassWhereAnnotationIsActuallyDefined(superE);
    }
}

Но я не смог получить функциональность, чтобы определить, есть ли у меня данный элемент на самом делеобъявленная аннотация или нет, которая будет работать с несколькими классами в иерархии, имеющими аннотацию (что, очевидно, возможно при java-отражении и методе класса getDeclaredAnnotations класса).

// edit: I'mсегодня я больше не думаю, так что, может быть, это очевидно, но было бы полезно иметь возможность обнаружить, если аннотируемость вообще объявляется более чем один раз в иерархии, поскольку я до сих пор даже не уверен, хочу ли я разрешить это.

1 Ответ

0 голосов
/ 27 января 2019

Вы пробовали https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html#getDeclaredAnnotationsByType-java.lang.Class-

getAnnotationsByType (...) также использует его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...