aspectj - ime-uspslago/slago-aspectj.pdf · programação orientada a objetos (poo) programação...

39
AspectJ Silvio do Lago Pereira Doutorando em Ciência da Computação [email protected]

Upload: vunhan

Post on 09-Dec-2018

243 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: AspectJ - IME-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

AspectJ

Silvio do Lago PereiraDoutorando em Ciência da Computação

[email protected]

Page 2: AspectJ - IME-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

Programação Orientada a Aspectos

Princípios básicos da POAIngredientes essenciais da POA

Benefício esperado da POA

Page 10: AspectJ - IME-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

AspectJ

O que é AspectJ ?Aspectos versus classes

Joinpoints e pointcutsAdvices e Introductions

Reusabilidade

Page 14: AspectJ - IME-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

Exemplos

RastreamentoSincronização

Otimização

Page 34: AspectJ - IME-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

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-USPslago/slago-AspectJ.pdf · Programação Orientada a Objetos (POO) Programação Orientada a Aspectos (POA) AspectJ Exemplos. Programação Orientada a Objetos Limitações

Fim