AspectJ
За информацията в тази статия или раздел не са посочени източници. Въпросната информация може да е непълна, неточна или изцяло невярна. Имайте предвид, че това може да стане причина за изтриването на цялата статия или раздел. |
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. Тези инструменти помагат на програмистите да разберат как аспектите пресичат кода.