AspectJ е аспектно-ориентирано разширение на програмния език Java създадено в Xerox PARC от Крис Маеда, който е оригиналият създател на термина „аспектно-ориентирано програмиране“. Работата на Xerox групата е интегрирана през декември 2002 в продукта на фондация Еклипс, разработваща едноименна Java платформа и IDE с отворен код. Това допринася AspectJ да се превърне в един от най-широко разпространените аспектно-ориентирани езици.

През март 2005, AspectWerkz се слива с AspectJ в единен език. Други комерсиални аспектно-ориентирани среди са JBoss и Spring AOP.

Просто описание на езика редактиране

Всички валидни Java програми са и валидни AspectJ програми, но AspectJ позволява на програмистите да дефинират специални конструкции наречени аспекти. Аспектите могат да съдържат няколко възможности, недостъпни в стандартните класове. Те са:

  • inter-type declarations – Позволяват на програмиста да добавя методи, полета или интерфейси в съществуващи класове отвътре на аспекта. Този пример добавя acceptVisitor метод към Point клас:
aspect VisitAspect {
void Point.acceptVisitor(Visitor v) {
v.visit(this);
}
}
  • pointcuts – Позволяват на програмиста да дефинира множество от съединени точки (добре дефинирани моменти при изпълнение на програмата, като извикване на метод, създаване на инстанция на обект или достъп до променливи). Всички точки са логически изрази (определения), които изчисляват истина всеки път, когато точката на съединяване се срещне. Следният pointcut прихваща всички изпълнения на всеки метод в обекта от тип Point, който започва със set:
pointcut set() : execution(* set*(..)) && this(Point);
  • advice – позволява на програмиста да специфицира какво действие да се изпълни когато pointcut е пресметнат като истина (true). Действията могат да се изпълнят преди, след или около точката на съединяване. В примера advice рефрешва дисплея всеки път, когато нещо в Point изпълнява set, използвайки pointcut-а деклариран по-нагоре:
after () : set() {
Display.update();
}

Инструменти, компилиране и AspectJ редактиране

Компилирането на AspectJ програма включва и допълнителен етап в сравнение с не-аспектно-ориентираните езици. Този етап се нарича уейвинг (weaving). Уейвингът се среща след като нормалната компилация на неаспектен или базов код приключи. Уейвинг процеса взема аспектите (pointcuts и advice) и определя къде advice може да се приложи най-подходящо в кода. Уейвинга може да се появи веднага след компилацията или този процес може да се забави докато класовете се заредят в JVM. Такъв процес е познат като load-time weaving.

Най-широко използваният и ефикасен компилатор за AspectJ се поддържа в AspectJ проекта, но има и друг – по-обширен и ориентиран към научноизследователска дейност компилатор, наречен се Aspect Bench Compiler, или abc.

Съзвкупност от инструменти, проектирани специално за работа с AspectJ в Eclipse Java IDE са разработени като друг проект на Eclipse, под името AJDT. Тези инструменти помагат на програмистите да разберат как аспектите пресичат кода.