![Page 2: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/2.jpg)
Novembro/2002 Silvio do Lago Pereira 2
Sumário
� Programação Orientada a Objetos (POO)
� Programação Orientada a Aspectos (POA)
� AspectJ
� Exemplos
![Page 3: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/3.jpg)
Programação Orientada a Objetos
Limitações da POORequisitos transversais
Rastreamento usando POOProblemas com essa abordagemA causa dos problemas da POO
![Page 4: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/4.jpg)
Novembro/2002 Silvio do Lago Pereira 4
Limitações da POO
� POO é o paradigma de programação da atualidade:
�Engenharia de Software
�metodologias e ferramentas
� POO tem algumas limitações:
� requisitos transversais (cross-cutting concerns)
�encapsulamento de requisitos transversais
![Page 5: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/5.jpg)
Novembro/2002 Silvio do Lago Pereira 5
Exemplos de requisitos transversais
� segurança
� persistência
� auditoria e depuração
� tratamento de exceções
� otimização de desempenho
� concorrência e sincronização
� regras e restrições do negócio
aplicação POA
![Page 6: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/6.jpg)
Novembro/2002 Silvio do Lago Pereira 6
Rastreamento usando POO
class Tracing {
public static void entry(String s) {
System.out.println("entry: " + s);
}
public static void exit(String s) {
System.out.println("exit: " + s);
}}
class Tracing {
public static void entry(String s) {
System.out.println("entry: " + s);
}
public static void exit(String s) {
System.out.println("exit: " + s);
}}
class Person {private String name = "";
public void setName(String name) {
Tracing.entry("setName("+name+")");
this.name = name;
Tracing.exit("setName()");
}...
}
class Person {private String name = "";
public void setName(String name) {
Tracing.entry("setName("+name+")");
this.name = name;
Tracing.exit("setName()");
}...
}
![Page 7: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/7.jpg)
Novembro/2002 Silvio do Lago Pereira 7
Problemas com essa abordagem
� Redundância
� Fraca coesão
� Forte acoplamento
� Dificuldade de compreensão
� Dificuldade de manutenção
� Dificuldade de reutilização
![Page 8: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/8.jpg)
Novembro/2002 Silvio do Lago Pereira 8
A causa dos problemas da POO
A decomposição primária
na POO é feita no plano.
O requisito transversal fica
espalhado pelas classes porque
é tratado na dimensão errada!
TracingO requisito transversal é ortogonal
à decomposição primária!
![Page 9: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/9.jpg)
Programação Orientada a Aspectos
Princípios básicos da POAIngredientes essenciais da POA
Benefício esperado da POA
![Page 10: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/10.jpg)
Novembro/2002 Silvio do Lago Pereira 10
Princípios básicos da POA
� A separação de requisitos transversais é um princípio que deve guiar todas as etapas numa metodologia de desenvolvimento de software.
� A modularização de requisitos transversais deve ser feita através de uma nova unidade de encapsulamento, denominada aspecto.
![Page 11: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/11.jpg)
Novembro/2002 Silvio do Lago Pereira 11
Ingredientes essenciais na POA
� Classes: encapsulam requisitos funcionais.� Aspectos: encapsulam requisitos transversais.� Weaver: entrelaça classes e aspectos num programa.
aspectos
classesprograma
weaver
![Page 12: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/12.jpg)
Novembro/2002 Silvio do Lago Pereira 12
Benefício esperado da POA
� Boa modularidade, mesmo quando temos requisitos transversais:
� facilidade de desenvolvimento
� facilidade de manutenção
� facilidade de reutilização
![Page 13: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/13.jpg)
AspectJ
O que é AspectJ ?Aspectos versus classes
Joinpoints e pointcutsAdvices e Introductions
Reusabilidade
![Page 14: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/14.jpg)
Novembro/2002 Silvio do Lago Pereira 14
O que é AspectJ ?
� É uma extensão de Java, orientada a aspectos.
� É um weaver que implementa POA em Java.
� É um preprocessador.
� Fácil de aprender e utilizar.
� Disponível gratuitamente.
![Page 15: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/15.jpg)
Novembro/2002 Silvio do Lago Pereira 15
Aspectos versus classes
� Aspectos são similares a classes:
� têm um tipo;
�podem ser estendidos;
�podem ser abstratos ou concretos;
�podem conter campos, métodos e tipos como membros.
![Page 16: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/16.jpg)
Novembro/2002 Silvio do Lago Pereira 16
Aspectos versus classes
� Aspectos são diferentes de classes:
�não têm construtor, nem destrutor;
�não podem ser criados com o operador new;
�podem conter pointcuts e advices como membros;
�podem acessar membros de outros tipos.
![Page 17: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/17.jpg)
Novembro/2002 Silvio do Lago Pereira 17
Joinpoints
� São pontos na execução de um programa, onde aspectos podem interceptar classes.
object
method
execução de método
chamada de método
getset
acesso acampo
field
![Page 18: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/18.jpg)
Novembro/2002 Silvio do Lago Pereira 18
Joinpoints
� Joinpoints são identificados por designadores:
� call(Signature)� execution(Signature)� initialization(Signature)� handler(TypePattern)� get(Signature)� set(Signature)� this(TypePattern)� target(TypePattern)� args(TypePattern, ...)� within(TypePattern)� cflow(PointCut)
![Page 19: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/19.jpg)
Novembro/2002 Silvio do Lago Pereira 19
Joinpoints
� Designadores podem ser genéricos:
�call(* set*())
�call(public Person.*(..))
�call(void foo(..))
�call(* *(..))
�call(*.new(int, int))
![Page 20: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/20.jpg)
Novembro/2002 Silvio do Lago Pereira 20
Pointcuts
� Predicados que definem conjuntos de joinpoints.
pointcut traced() :
call(public * set*(..));
pointcut traced() :
call(public * set*(..));
![Page 21: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/21.jpg)
Novembro/2002 Silvio do Lago Pereira 21
Pointcuts
� Pointcuts podem ser definidos como expressões booleanas, empregando-se !, && e ||.
pointcut move():
call(Point.setX(..)) ||
call(Point.setY(..)) ||
call(Line.setP1(..)) ||
call(Line.setP2(..));
pointcut move():
call(Point.setX(..)) ||
call(Point.setY(..)) ||
call(Line.setP1(..)) ||
call(Line.setP2(..));
![Page 22: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/22.jpg)
Novembro/2002 Silvio do Lago Pereira 22
� Pointcuts também podem ter argumentos.
Pointcuts
pointcut move(Object m, Shape s):
this(m) && target(s) &&
(call(Point.setX(..)) ||
call(Point.setY(..)) ||
call(Line.setP1(..)) ||
call(Line.setP2(..)));
pointcut move(Object m, Shape s):
this(m) && target(s) &&
(call(Point.setX(..)) ||
call(Point.setY(..)) ||
call(Line.setP1(..)) ||
call(Line.setP2(..)));
![Page 23: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/23.jpg)
Novembro/2002 Silvio do Lago Pereira 23
� São trechos de código associados a pointcuts, que injetam um novo comportamento em todos os joinpoints representados pelo pointcut.
� Tipos:�before
�after
�around
Advices
chamadochamador
After
advice
Before
advice
![Page 24: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/24.jpg)
Novembro/2002 Silvio do Lago Pereira 24
Advices
� Formas básicas:
� before(param) : pointcut(param) {...}
� after(param) : pointcut(param) {...}
� after(param) returning [formal] :
pointcut(param) {...}
� after(param) throwing [formal] :
pointcut(param) {...}
� type around(param) [throws typelist] :
pointcut(param) {...}
![Page 25: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/25.jpg)
Novembro/2002 Silvio do Lago Pereira 25
pointcut get(int index) :
args(index) && call(*get*(..));
before(int index) : get(index) {
System.out.println(index);
}
pointcut get(int index) :
args(index) && call(*get*(..));
before(int index) : get(index) {
System.out.println(index);
}
Fluxo de informação
designadordesignador
pointcutpointcut
adviceadvice
códigocódigo
![Page 26: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/26.jpg)
Novembro/2002 Silvio do Lago Pereira 26
Exemplo: Hello world!
public class Hello {
public static void main(String args[]) {
System.out.println("Hello world!");
}
}
public class Hello {
public static void main(String args[]) {
System.out.println("Hello world!");
}
}
public aspect Greetings {
pointcut pc() : call(* *main(..));
before() : pc() { System.out.println("Hi."); }
after() : pc() { System.out.println("Bye..."); }
}
public aspect Greetings {
pointcut pc() : call(* *main(..));
before() : pc() { System.out.println("Hi."); }
after() : pc() { System.out.println("Bye..."); }
}
![Page 27: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/27.jpg)
Novembro/2002 Silvio do Lago Pereira 27
Exemplo: Hello world!
>ajc Hello.java Greetings.java
>java Hello
Hi.
Hello world!
Bye...
>ajc Hello.java Greetings.java
>java Hello
Hi.
Hello world!
Bye...
![Page 28: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/28.jpg)
Novembro/2002 Silvio do Lago Pereira 28
Exemplo: Hello world!
/* Generated by AspectJ version 1.0.6 */
import java.io.*;
public class Hello {
public static void main(String[] args) {
try {
Greetings.aspectInstance.before0$ajc();
Hello.main$ajcPostCall(args);} finally {
Greetings.aspectInstance.after0$ajc();}
}
public Hello() {
super();
}
public static void main$ajcPostCall(String[] args) {
System.out.println("Hello world!");
}
}
/* Generated by AspectJ version 1.0.6 */
import java.io.*;
public class Hello {
public static void main(String[] args) {
try {
Greetings.aspectInstance.before0$ajc();
Hello.main$ajcPostCall(args);} finally {
Greetings.aspectInstance.after0$ajc();}
}
public Hello() {
super();
}
public static void main$ajcPostCall(String[] args) {
System.out.println("Hello world!");
}
}
![Page 29: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/29.jpg)
Novembro/2002 Silvio do Lago Pereira 29
Exemplo: Hello world!
/* Generated by AspectJ version 1.0.6 */
public class Greetings {
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();
}
}
/* Generated by AspectJ version 1.0.6 */
public class Greetings {
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();
}
}
![Page 30: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/30.jpg)
Novembro/2002 Silvio do Lago Pereira 30
Reflexão: thisJoinPoint
� É uma variável especial predefinida.
� É similar à variável this em Java.
� Disponibiliza várias informações a respeito do joinpoint que disparou o advice.
� Exemplos:
�thisJoinPoint.toString()
�thisJoinPoint.getArgs()
![Page 31: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/31.jpg)
Novembro/2002 Silvio do Lago Pereira 31
Introduction
� Um forma de introduzir novos membros a classes e interfaces já existentes.
public int Foo.bar(int x);
private int Foo.counter;
declare parents: Mammal extends Animal;
declare parents: MyThread implements
MyThreadInterface;
public int Foo.bar(int x);
private int Foo.counter;
declare parents: Mammal extends Animal;
declare parents: MyThread implements
MyThreadInterface;
![Page 32: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/32.jpg)
Novembro/2002 Silvio do Lago Pereira 32
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*());
}
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*());
}
![Page 33: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/33.jpg)
Exemplos
RastreamentoSincronização
Otimização
![Page 34: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/34.jpg)
Novembro/2002 Silvio do Lago Pereira 34
Rastreamento
aspect Tracing {
pointcut traced() : call(public * Person.*(..));
before() : traced() {
System.err.println("entry: " + thisJoinPoint);
}
after() : traced() {
System.err.println("exit: " + thisJoinPoint);}
}
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;}...
}
class Person {
private String name = "";
public void setName(String name) {
this.name = name;}...
}
![Page 35: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/35.jpg)
Novembro/2002 Silvio do Lago Pereira 35
Sincronização
aspect Synchronization {
private Semaphore s = new Semaphore();
pointcut updateSem(): call(public void set*(..));
before() : updateSem() { P(s); }
after() : updateSem() { V(s); }
}
aspect Synchronization {
private Semaphore s = new Semaphore();
pointcut updateSem(): call(public void set*(..));
before() : updateSem() { P(s); }
after() : updateSem() { V(s); }
}
![Page 36: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/36.jpg)
Novembro/2002 Silvio do Lago Pereira 36
Otimização
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);}
}
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);}
}
![Page 37: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/37.jpg)
Novembro/2002 Silvio do Lago Pereira 37
Otimização
aspect Memoization {
private HashTable cache = new HashTable();
pointcut fibs(int n):
execution(int Fibonacci.fib(int)) && args(n);
// calculate only if not already in cache!
int around(int n): fibs(n) {
Integer result = (Integer)cache.get(new Integer(n));
if (result == null) {
int f = proceed(n); // not found, calculate!
cache.put(new Integer(n), new Integer(f));
return f;
}
else return result.intValue(); // found, done!
}
}
aspect Memoization {
private HashTable cache = new HashTable();
pointcut fibs(int n):
execution(int Fibonacci.fib(int)) && args(n);
// calculate only if not already in cache!
int around(int n): fibs(n) {
Integer result = (Integer)cache.get(new Integer(n));
if (result == null) {
int f = proceed(n); // not found, calculate!
cache.put(new Integer(n), new Integer(f));
return f;
}
else return result.intValue(); // found, done!
}
}
![Page 38: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/38.jpg)
Novembro/2002 Silvio do Lago Pereira 38
Referências
� Kendall, E. A. Aspect-Oriented Programming in AspectJ, 2001.
� Kiczales, G. et all. Aspect-Oriented Programming, 1997.
� Kiczales, G. et all. An Overview of AspectJ, 2002.
� Voelter, M. Aspect-Oriented Programming in Java, 2000.
� The AspectJ Programming Guide, Xerox Corporation, 2002.
![Page 39: AspectJ - ime.usp.brslago/slago-AspectJ.pdf · AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação slago@ime.usp.br](https://reader034.vdocuments.site/reader034/viewer/2022050107/5f45abb846480712417c3e53/html5/thumbnails/39.jpg)
Fim