Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
CAPITOLUL II
9
Programare Orientată pe Aspecte în Java
10
Programare Orientată pe Aspecte în Java
11
Programare Orientată pe Aspecte în Java
12
Programare Orientată pe Aspecte în Java
- Hyper J
- JAC
- Jmangler
- AcrchJava
AspectJ este o extensie a limbajului Java lansată în anul 1998 de către o echipă
de cercetători de la Xerox Palo Alto Research Center condusă de Cristina Lopes şi
Gregor Kicyales care implementează conceptele programării orientate pe aspecte
folosind limbajul Java. Orice program corect scris în limbajul Java este şi un
program valid în AspectJ.
13
Programare Orientată pe Aspecte în Java
14
Programare Orientată pe Aspecte în Java
15
Programare Orientată pe Aspecte în Java
va fi ocolită.
16
Programare Orientată pe Aspecte în Java
2.3 Aplicaţie
17
Programare Orientată pe Aspecte în Java
18
Programare Orientată pe Aspecte în Java
Pointcut este utilizat prin definirea advise-ului. În exemplul prezentat, liniile 4-6
şi 7-9 definesc două advice-uri care se vor executa înaintea şi după primul pointcut.
La final, în liniile 10-15 se imlementează un advice pentru al doilea pointcut şi
se utilizează un set de precondiţii înainte de execuţia metodei
TestClass.sayAnyThing().
Compilare
19
Programare Orientată pe Aspecte în Java
Într-un program este posibil să existe advise-uri aflate în aspecte diferite care
să acţioneze asupra aceluiaşi join-point. În acest caz este necesar să se stabilească
ordinea în care acestea se vor executa.
Se consideră clasa Casa care conţine două metode care simulează intrarea şi
ieşirea din casă:
public class Casa{
void intrare(){
System.ot.println(“Intrare in casa”);
}
void iesire(){
System.out.println(“Iesire din casa”);
}
}
Se adaugă un aspect numit AspectLumini care simulează stingerea becurilor
înainte de intrarea în casă şi aprinderea becurilor după intrarea în casă:
public aspect AspectLumini{
after() : call (void Casa.intrare()){
System.out.println(“aprindere lumina”);
}
before() : call (void Casa.iesire()){
System.out.println(“stingere lumina”);
}
}
Se mai adaugă un aspect numit AspectAlarma care simulează activarea alarmei
înainte de ieşirea din casă şi dezactivarea alarmei după intrarea în casă:
public aspect Aspect Alarma{
after() : call (void Casa.intrare()){
System.out.println(“dezactivare alarma”);
20
Programare Orientată pe Aspecte în Java
}
before() : call (void Casa.iesire()){
System.out.println(“activare alarma”);
}
}
Clasa test:
public class Test{
public static void main (String[] args){
Casa casa=new Casa();
casa.intrare();
casa.iesire();
}
}
Rezultatul obţinut în urma rulării este:
intrare in casa
dezactivare alarma
aprindere lumina
stingere lumina
activare alarma
iesire din casa
Se observă că advice-urile din aspectul AspectAlarma au fost executate
înaintea celor din AspectLumini, ceea ce înseamnă că primul aspect a avut
prioritate mai mare decât al doilea. Recomandabil este invers, operaţiile de
activare/dezactivare să fie executate cu lumina aprinsă, ceea ce ar însemna
stabilirea unor priorităţi mai mari aspectului AspectLumini faţă de aspectul
AspectAlarma.
Stabilirea unor priorităţi crescătoare pentru mai multe aspecte se realizează
folosind următoarea construcţie sintactică, în cadrul unui aspect separat:
declare precedence : aspect_1, aspect_2,..., aspect_n;
În exemplul de mai sus trebuie sa mai adăugăm şi aspectul Prioritate:
Public aspect Prioritate{
Declare precedence: AspectAlarma, AspectLumini;
21
Programare Orientată pe Aspecte în Java
22