Какова концепция: Тип - Элемент - Зеркало

17

Я работаю с обработкой аннотации Java 6, то есть тем, что можно найти внутри javax.annotation.processing (а не APT от Java 5).

Интересно, какова концептуальная разница между различными классами Element , Type и Mirror . Поскольку я действительно не понимаю этого, сложно эффективно программировать обработчик аннотации. Существуют различные методы, которые «конвертируют» между этими понятиями, но я не совсем уверен, что я делаю при их использовании.

Итак, например, дайте мне экземпляр AnnotationMirror .
Когда я вызываю getAnnotationType() , я получаю экземпляр DeclaredType (который по какой-либо причине реализует TypeMirror ).
Затем я могу вызвать asElement() на этом и получить экземпляр Element .
Что случилось?

    
задан Wolfgang 23.01.2010 в 13:27
источник

3 ответа

5

Объект типа javax.lang.model.element.AnnotationMirror представляет аннотацию в вашем коде.

Объявленный тип представляет класс аннотации.

Его элемент является общим классом (см. Ссылка для получения дополнительной информации по этому вопросу). Элементом может быть общая версия класса, например List , где, поскольку объявленный тип является параметризованной версией, например List<String> . Однако я не уверен, что в классах аннотаций могут использоваться дженерики, и, таким образом, различие может быть неактуальным в этом контексте.

Например, скажем, у вас есть следующий метод JUnit4:

@Test(expected = MyException.class)
public void myTest() {  
     // do some tests on some class...
}

AnnotationMirror представляет @Test(expected = NullPointerException.class) . Объявленный тип - это класс org.junit.Test . Элемент более или менее совпадает с тем, что не существует никаких дженериков.

    
ответ дан Guillaume 24.01.2010 в 01:10
источник
  • Javadoc не совсем ясно, что такое TypeElement. Я думаю, что он больше привязан к объявлению типа (таким образом, к параметрам типа), в то время как TypeDeclaration (confusing name) больше привязан к типу типа, например, в объявлении переменной. Я понимаю, что эти два термина трудно понять в контексте аннотаций. –  Wolfgang 27.01.2010 в 13:52
  • Но в соответствии с этим вопросом DeclareType должен быть MyException.class –  overexchange 11.07.2015 в 15:01
19

Фактически существует перекрытие между этими понятиями.

  • Element моделирует статическую структуру программы, то есть пакеты, классы, методы и переменные. Просто подумайте обо всем, что вы видите в проводнике пакетов Eclipse.

  • Type моделирует статически определенные ограничения типа программы, т. е. типы, параметры типового типа, групповые символы общего типа. Просто подумайте обо всем, что является частью деклараций типа Java.

  • Mirror - альтернативное понятие для размышления Гилада Брача и Дэйва Унгага, первоначально разработанного для Self, основанного на прототипе диалекта Smalltalk. Основная идея состоит в том, чтобы отделить запросы от структуры кода (а также манипуляции со структурой структуры, увы, недоступной в Java) из объектов домена. Поэтому, чтобы запросить объект о его методах, вместо вызова #getClass вы спросите систему о зеркале, через которое вы можете увидеть отражение объекта. Благодаря этому разделению вы также можете зеркалировать классы, которые не загружаются (как в случае обработки аннотации), или даже классы на удаленном изображении. Например, V8 (механизм Javascript Google) использует зеркала для отладки кода Javascript, который выполняется в другом пространстве объекта.

ответ дан akuhn 24.01.2010 в 15:12
источник
  • Понимание этой точки «вы также можете зеркалировать классы, которые не загружены (как в случае обработки аннотации), действительно помогли мне работать с процессором обработки аннотаций. –  Guillaume 02.02.2017 в 13:52
5

Этот документ может помочь в разработке дизайна обработки аннотации Java 6:

  

Гилад Брача и Дэвид Унгар. Зеркала:   Принципы проектирования для метауровня   Объекты объектно-ориентированных   Языки программирования. В Proc. из   ACM Conf. по объектно-ориентированным   Программирование, системы, языки и   Приложения, октябрь 2004 г.

    
ответ дан Yardena 24.01.2010 в 14:54
источник
  • Итак, вместо отражения api, как getClass в традиционной системе отражения, есть ли у нас зеркальный рефлекс api's? java.lang.model.element.AnnotationMirror - это что-то вроде ClassMirror (как упоминалось в этой статье)? –  overexchange 10.07.2015 в 01:55