Как прочитать исходный код ломбока?

В последнее время у меня большой интерес к "ломбоку". И я хочу узнать это больше, прочитав исходный код.

Но после того, как попробовал, мне было очень трудно. я нашел только две реализации "javac" и "ECJ". но не понимаю, как это работает от начала до конца.

Кто-нибудь может дать совет? как сначала прочитать, какой пакет/класс или поток логики?

Спасибо.


person Sloth    schedule 02.01.2014    source источник


Ответы (1)


В настоящее время я пишу бакалаврскую диссертацию по Ломбоку, поэтому попытаюсь кое-что объяснить. Lombok использует Java Annotation Processing [1], который в основном запускает некоторую предопределенную задачу на узлах (например, классы, методы), где используется определенная аннотация. Однако вы не можете изменить существующий исходный код, используя этот подход, поэтому Lombok использует внутренние API, которые не поддерживаются и могут быть изменены. Вот почему многие ненавидят Ломбок, так как это по сути хак.

Чтобы начать с исходного кода Lombok, есть два основных пакета:

  • lombok.javac где находится реализация для компилятора Oracle Java
  • lombok.eclipse где находится реализация для компилятора Eclipse

Я кратко опишу часть компилятора Oracle. Вот что происходит во время компиляции вашего проекта с аннотациями ломбока.

  1. Вызывается lombok.javac.apt.Processor#process(...), и единицы компиляции (считайте их классами) передаются этому классу для обработки.
  2. Процессор передает их классу JavacTransformer, где они преобразуются в AST.
  3. Затем этот AST просматривается с помощью JavacTransformer.AnnotationVisitor, который ищет все аннотации в коде. Это важная часть, поскольку посетитель может найти ВСЕ аннотации, обработка аннотаций Java не может обнаружить все аннотации (например, она игнорирует аннотации внутри методов).
  4. Каждая найденная аннотация обрабатывается HandlerLibrary, в которую загружены все преобразования (например, @Getter) и известно, какое преобразование следует активировать для какой аннотации.
  5. Инициируется преобразование, то есть класс, реализующий JavacAnnotationHandler. Вы можете найти преобразования в пакете lombok.javac.handlers. Преобразование проверяет правильность использования аннотации и выполняет свою работу (например, @Getter создает метод получения).

Где хакерская часть? Что ж, если вы посмотрите в код, вы увидите некоторые подозрительные приведения типов, например:

(JCCompilationUnit) path.getCompilationUnit();

Lombok ожидает получить определенные реализации интерфейсов и использует эти внутренние реализации, чтобы делать то, что он делает.

Дальнейшее чтение:

[1] http://deors.wordpress.com/2011/10/08/annotation-processors/ — хороший учебник
[2] Как работает ломбок ? объяснил ведущий разработчик Lombok, почему Lombok использует внутренние API
[3] http://notatube.blogspot.cz/2010/12/project-lombok-creating-custom.html статья о добавлении собственных преобразований

Развлекайся!

person Coffei    schedule 14.04.2014