Получение полного имени из аннотации с использованием Eclipse JDT AST - PullRequest
0 голосов
/ 20 ноября 2019

Я использую Eclipse JDT для сборки AST для исходного кода Java, поэтому я могу провести некоторый анализ кода. В настоящее время я хотел бы получить полное название аннотации. Рассмотрим приведенный ниже код:

import javax.persistence.Entity; 

@Entity
public class Class1

Если я посещаю этот модуль компиляции, @Entity является аннотацией маркера. И я могу сделать некоторый анализ этого. Однако я не могу получить полностью квалифицированное имя. Я хотел бы получить "javax.persistence.Entiy". Я пробовал несколько способов, но безуспешно.

public boolean visit(MarkerAnnotation node) {
        node.getTypeName(); //returns the simple name
        node.getTypeName().getFullyQualifiedName();// I thought this would print javax.persistence.Entiy, 
                                                   // but it only prints "Entity"
        node.resolveTypeBinding().getName(); //Prints "Entity"
        node.resolveTypeBinding().getBinaryName(); // Prints "Entity"
        node.resolveAnnotationBinding().getName(); //Prints "Entity"
        return super.visit(node);
    }

Я также пытался привести MarkerAnnotation к Annotation, но я все еще не могу получить полностью определенное имя. Во время отладки сеансов я не имел успеха ни при навигации по этому узлу

Мне удалось получить полное имя, используя метод import () объекта CompilationUnit. Я сделал несколько строковых манипуляций на них, объединив с аннотациями простое имя. Тем не менее, я чувствую, что это своего рода хакерство, и мне нужно рассмотреть каждый импорт, даже тот, который не связан с аннотациями.

Я хотел бы получить полное имя непосредственно из узла, то есть из MarkerAnnotation, NormalAnnotation и SingleMemberAnnotation. Есть ли способ добиться этого? Чего мне здесь не хватает?

Заранее спасибо!

1 Ответ

1 голос
/ 21 ноября 2019

Из javadoc Annotation.resolveAnnotationBinding () :

Обратите внимание, что привязки (включая разрешенные аннотации), как правило, недоступны, если не запрашиваются при построении AST.

Поэтому, пожалуйста, проверьте, как вы настраиваете ASTParser, см. ASTParser.setResolveBindings (логическое)

...