Escolar Documentos
Profissional Documentos
Cultura Documentos
Sumrio
Novembro/2006
Novembro/2006
Classes: encapsulam requisitos funcionais. Aspectos: encapsulam requisitos transversais. Weaver: entrelaa classes e aspectos num programa.
programa
classes
weaver aspectos
Novembro/2006 Leoncio Regal Dutra 5
Novembro/2006
AspectJ
O que AspectJ ? Aspectos versus classes Joinpoints e pointcuts Advices e Introductions Reusabilidade
O que AspectJ ?
um weaver que implementa POA em Java. um preprocessador. Fcil de aprender e utilizar. Disponvel gratuitamente.
Novembro/2006
um tipo;
ser estendidos; ser abstratos ou concretos; conter campos, mtodos e tipos como membros.
Novembro/2006
podem podem
Novembro/2006
10
Joinpoints
Novembro/2006
11
Joinpoints
Novembro/2006
12
Joinpoints
set*())
call(public
Novembro/2006
13
Pointcuts
Novembro/2006
14
Pointcuts
Pointcuts podem ser definidos como expresses booleanas, empregando-se !, && e ||.
pointcut move(): call(Point.setX(..)) || call(Point.setY(..)) || call(Line.setP1(..)) || call(Line.setP2(..));
Novembro/2006
15
Pointcuts
Novembro/2006
16
Advices
So trechos de cdigo associados a pointcuts, que injetam um novo comportamento em todos os joinpoints representados pelo pointcut. Tipos:
before
after around
After advice
Before advice
chamador
chamado
Novembro/2006
17
Advices
Formas bsicas:
pointcut(param) {...}
Novembro/2006
18
Fluxo de informao
pointcut get(int index) : args(index) && call(*get*(..));
pointcut designador
advice
cdigo
Novembro/2006
19
public aspect Greetings { pointcut pc() : call(* *main(..)); before() : pc() { System.out.println("Hi."); } after() : pc() { System.out.println("Bye..."); } }
Novembro/2006
20
Novembro/2006
21
Greetings.aspectInstance.before0$ajc(); Hello.main$ajcPostCall(args);
} finally {
Greetings.aspectInstance.after0$ajc();
} } public Hello() { super(); }
Novembro/2006
22
public final void before0$ajc() { System.out.println("Hi."); } public final void after0$ajc() { System.out.println("Bye..."); }
public Greetings() { super(); } public static Greetings aspectInstance; public static Greetings aspectOf() { return Greetings.aspectInstance; } public static boolean hasAspect() { return Greetings.aspectInstance != null; } static { Greetings.aspectInstance = new Greetings(); } }
Novembro/2006 Leoncio Regal Dutra 23
Reflexo: thisJoinPoint
Novembro/2006
24
Introduction
Novembro/2006
25
Reusabilidade
public abstract aspect Tracing { protected abstract pointcut trace(); // advice code } public aspect MyTracing extends Tracing { // just define which calls to trace protected pointcut trace(): call(* set*()); }
Novembro/2006
26
Exemplos
Rastreamento Sincronizao Otimizao
Rastreamento
aspect Tracing { pointcut traced() : call(public * Person.*(..)); before() : traced() { System.err.println("entry: " + thisJoinPoint); } after() : traced() { System.err.println("exit: " + thisJoinPoint); } } class Person { private String name = ""; public void setName(String name) { this.name = name; } ... }
Novembro/2006 Leoncio Regal Dutra 28
Sincronizao
aspect Synchronization {
after()
}
: updateSem() { V(s); }
Novembro/2006
29
Otimizao
public class Fibonacci { public static int fib(int n) { if( n < 2 ) { System.err.println(n + "."); return 1; } else { System.err.print(n + ","); return fib(n-1) + fib(n-2); } } public static void main(String[] args) { int f = fib(10); System.err.println("Fib(10) = " + f); }
Leoncio Regal Dutra 30
Novembro/2006
Otimizao
aspect Memoization { private HashTable cache = new HashTable();
Fim