Java Метод обработки аннотаций getEnclosingElement () - PullRequest
0 голосов
/ 07 марта 2020

Здравствуйте, would Я хотел бы спросить, что означает комментарий метода getEnclosingElement() в интерфейсе Element, я не совсем понимаю. javado c следующим образом:

Возвращает самый внутренний элемент, внутри которого, свободно говоря, заключен этот элемент.

  • Если этот элемент является элементом, объявление которого немедленно лексически заключен в объявлении другого элемента, этот другой элемент возвращается.

  • Если это тип верхнего уровня , возвращается его пакет.

  • Если это пакет , возвращается ноль.

  • Если это параметр типа , Элемент generi c параметра type возвращается.
  • Если это параметр метода или конструктора , возвращается исполняемый элемент, который объявляет параметр.

Аннотации могут использоваться для классов, переменных (глобальных или локальных), методов и т. Д. c., Но я не знаю соответствия между аннотациями и подклассом Element. Спасибо !!!

1 Ответ

1 голос
/ 07 марта 2020

Element может представлять, начиная с Java 13:

  • Объявление модуля - ModuleElement
  • Объявление пакета - PackageElement
  • Интерфейс, класс, перечисление или тип аннотации - TypeElement
  • Конструктор, метод или инициализатор - ExecutableElement
  • Поле, константа перечисления, метод или параметр конструктора, локальная переменная, переменная ресурса или параметр исключения - VariableElement
  • Параметр типа - TypeParameterElement

Каждый из этих элементов может иметь аннотации. Например:

module-info. java:

@Foobar
module example {
  exports com.example;
}

package-info. java:

@Foobaz
package com.example;

Foo. java:

package com.example;

@Baz
public class Foo<@Qux T> {

  private final T bar;

  public Foo(T bar) {
    this.bar = bar;
  }

  @Override
  public String toString() {
    return "Foo{bar= " + bar + "}";
  }
}
  • Модуль example, который будет ModuleElement, имеет аннотацию @Foobar .
  • Пакет com.example, который будет PackageElement, содержит @Foobaz аннотацию.
  • Класс Foo, который будет TypeElement, имеет @Baz присутствует аннотация.
  • Параметр типа T, который будет TypeParameterElement, содержит @Qux аннотацию.
  • Поле bar, которое будет быть VariableElement, аннотации отсутствуют.
  • Конструктор #Foo(T), который будет ExecutableElement, аннотации отсутствуют.
  • Параметр конструктора bar, который будет VariableElement, аннотации отсутствуют.
  • Метод #toString(), который будет ExectuableElement, имеет аннотацию @Override.

You можно получить аннотации к этим элементам с помощью методов * 10 81 * интерфейс, который расширяется Element.

Метод Element#getEnclosingElement(), что неудивительно, возвращает Element, который охватывает текущий Element, если таковой имеется. Таким образом, если бы вы вызвали этот метод для ExecutableElement, представляющего метод #toString(), вы бы получили TypeElement, представляющий класс Foo.

...