Какова концепция позади: Тип - Элемент - Зеркало - PullRequest
17 голосов
/ 23 января 2010

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

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

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

Ответы [ 3 ]

20 голосов
/ 24 января 2010

Между этими понятиями действительно есть совпадение.

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

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

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

5 голосов
/ 24 января 2010

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

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

5 голосов
/ 24 января 2010

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

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

Его элементом является общий класс (см. http://java.sun.com/javase/6/docs/api/javax/lang/model/element/TypeElement.html для получения дополнительной информации по этому вопросу). Элементом может быть универсальная версия класса, например 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. Элемент более или менее одинаков, так как в нем нет общих элементов.

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