AspectJ-компилятор (ajc) против обработки во время загрузки

#aspectj

#aspectj

Вопрос:

Здесь несколько вопросов:

  • Изменяет ли ajc все классы, которые он компилирует (даже не-аспектные)? Что, если я скомпилирую только классы аспектов, а затем помещу их в тот же путь к классам, что и обычные?

  • Выполняется ли проект, скомпилированный ajc, быстрее, чем тот, который использует обработку во время загрузки?

  • Что, если мне нужно написать библиотеку, которая выполняет трассировку с помощью AspectJ, а затем я хочу, чтобы эта библиотека работала с ЛЮБЫМ проектом? Является ли обработка во время загрузки единственным вариантом в этом случае?

Ответ №1:

  1. ajc (время компиляции) изменит только классы, на которые влияют аспекты. Помните, ajc является расширением компилятора Java (если быть точным, он основан на компиляторе JDT Eclipse 3.3). Таким образом, он скомпилирует все ваши классы Java, как обычный компилятор Java. Затем он дополнительно переплетет все классы, на которые влияет аспект. Если вы скомпилируете свои аспекты отдельно от своих не-аспектов, тогда не будет обработки во время компиляции, и ваши аспекты не будут иметь никакого влияния. Однако вы можете поместить свои аспекты в aspect path компиляции ваших не-аспектов (если ваши не-аспекты скомпилированы ajc). Это позволит вашим аспектам переплетаться с вашими аспектами.
  2. Время запуска при CTW намного лучше, чем при LTW, но после загрузки всех классов разница в скорости должна быть незначительной. Причина в том, что в LTW все классы переплетаются при загрузке. Это означает, что для загрузки классов требуется дополнительный этап переплетения, который не является необходимым в CTW.
  3. Нет. Как упоминалось выше, вы можете добавить аспекты в свой aspect path второго проекта, и тогда они будут переплетены во время компиляции.

Подробнее о пути к аспекту:

http://www.eclipse.org/aspectj/doc/released/devguide/ajc-ref.html