Programando em AspectoJ - JAVA

Embed Size (px)

Citation preview

  • 8/7/2019 Programando em AspectoJ - JAVA

    1/32

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 1 - Orientao a objetos

    m objeto um componente de software - uma parte de um sistema que exibe, ou deveria exibir, certas caractersticas

    pecficas. Nessa aula vamos ver algumas dessas caractersticas1. Comportamento e estado

    O estado de um objeto o conjunto de suas propriedades; O comportamento de um objeto so as funes que afetam suas propriedades ou as de outros objetos; Cada objeto tem seu prprio estado

    2. Instncias e classes Cada objeto uma instncia de alguma classe; Uma classe define quais as propriedades que tem cada uma de suas instncias e comportamento delas; H apenas uma "cpia" do comportamento (mtodos da classe).

    3. Acoplamento e coeso Acoplamento o nvel de dependncia entre classes; Deve-se tentar minimizar o acoplamento para evitar a propagao de mudanas e para possibilitar a

    reutilizao de classes; Coeso o nvel de integridade interna de uma classe; Classes com alta coeso tm responsabilidades bem definidas e so difceis de dividir em duas ou mais

    classes; Classes com baixa coeso tratam de responsabilidades diversas e em geral podem ser divididas. Deve-se tentar maximizar a coeso das classes.

    4. Interfaces e implementaes Cada objeto define uma interface pblica;

    A interface consiste dos comportamentos e estado do objeto que podem ser acessados por outros objetos; A interface um contrato; mudar a interface significa violar o contrato e pode ter consequncias graves; A implementao o modo como o objeto realiza as obrigaes impostas pelo contrato; Outros objetos no deveriam ser afetados por mudanas na implementao. A interface de um mtodo tambm chamada de assinatura, e consiste do nome do mtodo mais seus

    parmetros formais. Um mtodo sobrecarregado quando uma classe tem mais de um mtodo com o mesmo nome, mas

    diferentes listas de parmetros.

    xemplo: a cozinha inteligente de Torsten

    u gostaria de um sistema que soubesse que ingredientes eu tenho em casa (na despensa e geladeira) e que guardasseinhas receitas favoritas. Ele me permitiria fazer trs consultas: descobrir se tenho em casa os ingredientes necessriosra preparar uma receita, descobrir que receitas posso preparar com os ingredientes que tenho em casa, e descobrir queceitas posso preparar com um conjunto especfico de ingredientes.

    Quais so as classes desse sistema? Qual o estado de cada classe? Qual a funcionalidade que cada classe deve prover? Como so as dependncias entre as classes?

    xerccio 1: Projeto da cozinha inteligenteesenhar um diagrama de classes que mostre as classes do sistema, seus dados, mtodos e relacionamentos entre classes.eve ser possvel inferir do diagrama como sero respondidas as trs consultas acima.

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/
  • 8/7/2019 Programando em AspectoJ - JAVA

    2/32

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 2 - Herana

    uponha que voc est fazendo um sistema para gerenciar uma locadora de vdeo que aluga e vende DVDs.aturalmente, voc precisa de pelo menos duas classes para cuidar dos seus produtos:ass DVDdeVender {private float preo;public void vender();public void devolver();public void recibo();

    ass DVDdeAlugar {private float preo;private Date dataDevoluo;public void alugar();

    public void devolver();public void recibo();

    o entanto, voc nota que as duas classes so muito semelhantes e gostaria de no ter de repetir esforos na sua criao eo. O mecanismo que permite isso a herana.

    erana um relacionamento entre classes que uma das caractersticas principais da orientao a objetos. A classerdada a classe pai, ou superclasse, e a classe herdadora a classe filha, ou subclasse.

    classe filha herda todos os membros (dados e mtodos) da classe pai. No entanto, a classe filha s tem acesso direto aembros declarados como public ou protected.

    terfaces e implementaes:

    A interface da classe filha contm a interface da classe pai. A classe filha pode acrescentar membros sua interface. A classe filha NO pode remover membros da interface herdada. A classe filha pode alterar a implementao de um mtodo herdado, sobrepondo a implementao com uma nova;

    instncias da classe filha usaro a nova implementao e no a herdada.

    duas motivaes principais para o uso da herana:

    Herana para construo Herana para substituio

    erana para construo

    Usa-se herana para construo quando o objetivo reutilizar uma classe existente para criar uma semelhante. Um ou mais mtodos so sobrepostos para se mudar a funcionalidade da classe. Objetivo reaproveitamento de cdigo. Em geral, o uso de herana somente para construo fruto de de um projeto ruim; deve-se buscar solues que

    usem tambm herana para substituio.

    xemplo:

    ass DVDdeVender {private float preo;public void adquirir();public void devolver();public void recibo();

    ass DVDdeAlugar extends DVDdeVender {

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    3/32

    private Date dataDevoluo;public void adquirir();public void devolver();

    erana para substituio

    o exemplo acima, o uso de herana reduziu a quantidade de cdigo necessria da construo da classe. A heranambm nos permite reduzir o cdigo necessrio para o uso da classe. Por exemplo, suponha que tenhamos a seguinteasse para armazenar nosso estoque de DVDs:

    blic class ColeoDeDVDs {private DVDdeAlugar[] dvdsDeAlugar;private DVDdeVender[] dvdsDeVender;private int numeroDVDsAlugar;private int numeroDVDsVender;

    public void acrescentarDVDdeVender(DVDdeVender d) {

    dvdsDeVender[numeroDVDsVender] = d;numeroDVDsVender++;

    }public void acrescentarDVDdeAlugar(DVDdeAlugar d) { ... }

    // Imprimir todos os DVDspublic void relatrio() {

    for (int i=0; i < numeroDVDsAlugar; i++) {dvdsDeAlugar[i].imprimir();

    }for (int i=0; i < numeroDVDsVender; i++) {

    dvdsDeVender[i].imprimir();}

    }

    regra da substituio diz que sempre que um programa espera um objeto (por exemplo, como parmetro de umtodo, ou em uma atribuio) podemos substituir o objeto por outro objeto que seja instncia de uma classe que filhaclasse esperada.

    eve-se sempre seguir a regra do -UM para se saber se uma subclasse apropriada. Por exemplo, um DVDdeAluguelo -UM DVDdeVender. So coisas diferentes. No entanto, tanto DVDdeAluguel -UM DVD quanto DVDdeVenderUM DVD. Vamos ento reescrever a nossa hierarquia:

    blic class DVD {private float preo;public void adquirir();public void devolver();public void recibo();

    blic class DVDdeVender extends DVD {public void adquirir();public void devolver();

    blic class DVDdeAlugar extends DVD {private Date dataDevoluo;public void adquirir();public void devolver();

    classe DVD contm todos os dados e funes comuns s duas classes anteriores. Cada classe herda esses membros e

    nda acrescenta aquilo que lhe particular.distino entre interface e implementao importantssima aqui: como a subclasse necessariamente contm aterface da classe pai, garante-se que a substituio possvel.

    utra regra importante de se lembrar que pode-se sempre atribuir uma instncia de uma subclasse a uma varivel daperclasse, mas nunca se pode fazer o contrrio. Ou seja,

  • 8/7/2019 Programando em AspectoJ - JAVA

    4/32

    DVD d1 = new DVDdeAlugar(); // OKDVDdeAlugar d2 = new DVD(); // No permitido.

    princpio da substituio nos permite reescrever a classe ColeoDeDVDs:

    blic class ColeoDeDVDs {private DVD[] dvds;private int numeroDVDs;

    public void acrescentarDVD(DVD d) {

    dvds[numeroDVDs] = d;numeroDVDs++;

    }

    // Imprimir todos os DVDspublic void relatrio() {

    for (int i=0; i < numeroDVDs; i++) {dvds[i].imprimir();

    }}

    sando o princpio da substituio, podemos usar a classe ColeoDeDVDs para acrescentar ambos os tipos de DVD:

    blic static void main() {ColeoDeDVDs c;

    c.acrescentarDVD(new DVDdeAlugar());c.acrescentarDVD(new DVDdeVender());c.relatrio();

    olimorfismo um termo usado no mundo OO para se referir substituio de classes por subclasses.

    asses abstratas e interfaces

    procedimento de devoluo de DVDs vendidos e alugados bem diferente. O que colocar na classe DVD, ento? Umaasse pode ter mtodos sem implementao, apenas interface. Uma classe que tenha algum mtodo sem implementaochamada classe abstrata

    blic abstract class DVD {private float preo;public abstract void adquirir();public abstract void devolver();public void recibo();

    asses abstratas no podem ser instanciadas e servem apenas como base para substituio.

    ma interface (em Java) uma classe que no tem nenhum dado e em que todos os mtodos so abstratos. Herdar deterfaces tem uma sintaxe prpria, sendo um tipo especial de herana, porque uma mesma classe pode herdar de vriasterfaces.

    o exemplo abaixo, Cloneable uma interface da biblioteca padro Java que define um nico mtodo, clone(), eomparable uma interface que define o mtodo compareTo().

    blic class DVDdeAlugar extends DVD implements Cloneable, Comparable {...

    nse: o que se ganha em declarar que se est implementando uma interface? Por que no simplesmente implementarone() e compareTo sem declarar que se est implementando a interface?

  • 8/7/2019 Programando em AspectoJ - JAVA

    5/32

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 3 - Java

    ratamento de Excees

    ma exceo um evento que foge ao fluxo normal esperado de um programa.

    todos devem capturar as excees geradas. Se um mtodo no capturar a exceo, abandona-se o mtodo e retorna-semtodo chamador, e assim por diante, at que a exceo seja capturada ou que se saia do programa principal (main).

    xcees so objetos tambm. Em Java, existem vrias classes de excees, todas elas subclasses deva.lang.Exception. O usurio pode criar novas subclasses.

    uando um mtodo gera uma exceo, diz-se que ele joga (throws) a exceo. Em Java, usa-se o comando throw. Asinatura do mtodo deve declarar todas as excees jogadas por ele.

    id usaDisco( ) throws IOException {if (deuProblemaDeDisco) {

    throw (new IOException() );}

    xcees so capturadas em blocos try..catch. Para capturar uma exceo, o mtodo deve ser chamado dentro do blocoy. Se a exceo for jogada, o controle passa para o bloco catch. Por exemplo,

    id interpretar(String s) {try {

    int numero;numero = Integer.parseLong(s);

    } catch (NumberFormatException e) {System.out.println("Erro: o string nao um numero valido");e.printStackTrace();

    }

    o mtodo no capturar a exceo, ele tem de declarar que ela jogada:

    id interpretar(String s) throws NumberFormatException {int numero;numero = Integer.parseLong(s);

    eve-se usar excees unicamente para situaes excepcionas; nunca se deve usar excees para regular o fluxo normal sistema.

    erenciamento de memria

    m Java, variveis de tipos primitivos so alocadas automaticamente quando declaradas e liberadas quando saem docopo em que foram declaradas. A passagem de parmetro dessas variveis feita por valor, ou seja, feita uma cpiavarivel para servir de parmetro.

    or outro lado, objetos so tratados de maneira completamente diferente. No so alocados automaticamente. Aclarao apenas cria uma referncia a um objeto. Para se alocar um objeto, usa-se o comando new. Objetos no so

    berados quando saem de escopo, mas sim liberados automaticamente quando no h mais nenhuma referncia a eles,m processo chamado de "coleta de lixo" (garbage collection).

    // O parmetro x alocado e criado quando o mtodo executado.void teste(int x) {

    int i; // Um inteiro alocado aquiString s; // Um String declarado, mas no existe aindas = new String() // Agora sim um String foi alocado

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    6/32

    }// x e i deixam de existir aqui e so liberados. O string s// poderia continuar existindo, mas no h mais referncias a ele// pois "s" est fora de escopo, ento o string liberado.

    onstrutores

    va tem oito tipos primitivos: boolean, byte, char, short, int, long, float e double. Tipos primitivos so alocadostomaticamente quando declarados.

    s tipos restantes so classes. Classes no so alocadas automaticamente. Objetos declarados inicialmente tem o valor

    ll. Para se criar um objeto, usa-se o comando new.t i; // tipo primitivote d = new Date(); // Classe Date

    uando o objeto criado, um mtodo especial chamado construtor executado. O construtor tipicamente inicializa ojeto com valores aceitveis. Construtores so frequentemente sobrecarregados para aceitarem listas de valores paraicializao.

    construtor de uma subclasse deve chamar o construtor da superclasse para garantir que os membros herdados sejamecutados devidamente. A chamada se faz com o comando super(), que deve ser o primeiro comando do construtor. Nardade, pode-se acessar qualquer membro da superclasse com a notao super.membro().

    todos teis

    odas as classes so subclasses da classe Object. Dela so herdados alguns mtodos que podem ser sobrepostos e souito usados. Por exemplo:

    public boolean equals(Object obj);

    Retorna verdadeiro se dois objetos so equivalentes. A comparao entre variveis de tipos primitivos pode serfeita com o operador ==. No entanto, quando usado entre dois objetos, == retorna verdadeiro somente se os doisobjetos sendo comparados so o mesmo objeto. Para compararmos o contedo, devemos sempre usar equals.

    String s1, s2, s3;s1 = "Bom dia";s2 = "Bom dia";s3 = s1;// Todos os 3 valem "Bom dia"s1 == s2 // Falsos1 == s3 // Verdadeiros1.equals(s2) // Verdadeiro

    A implementao de equals herdada de Object faz uma comparao simples, bit-a-bit, dos objetos. Se a classecontiver apenas dados formados por tipos primitivos, a implementao herdada suficiente. Se ela contiveroutros objetos, no entanto, preciso sobrepor o mtodo herdado com um mais apropriado (por qu? e como

    esse mtodo sobreposto?). public String toString();

    Retorna uma representao do valor do objeto em forma de String. public Object clone();

    O mtodo clone retorna uma cpia do objeto alvo. Se o objeto contiver referencias a outros objetos, a cpiaconter as mesmas referncias - chama-se isso de cpia "rasa" (shallow copy). Para se duplicar toda a estrutura doobjeto, necessrio sobrepor o mtodo herdado com um que faa a cpia corretamente.

    ypecasting

    ocasies em que necessrio converter um objeto de um tipo em outro. Por exemplo, o mtodo clone acima retornama instncia de Object. O que aconteceria no caso a seguir?

    String s1, s2;s1 = "Bom dia";s2 = s1.clone();

  • 8/7/2019 Programando em AspectoJ - JAVA

    7/32

    a ltima linha, estamos tentando atribuir um objeto da classe Objecta um objeto da classe String. Lembre-se que nodemos atribuir um objeto da superclasse a um objeto da subclasse, apenas o contrrio. Assim, necessrio "forar" olor retornado a ter o tipo que queremos. Isso se chama "typecasting" (moldar o tipo):

    s2 = (String) s1.clone();

    se pode fazer typecasting de uma superclasse para uma subclasse. No se pode faz-lo entre classes "irms".

    acotes

    ada classe Java pertence a um pacote, que um conjunto de classes relacionadas. A biblioteca de classes padro Java

    ntm inmeros pacotes com classes teis, como por exemplo:va.lang // Classes bsicas da linguages como Integer, String, etc.va.util // Classes "utilitarias" como conjuntos, datas, etc.va.io // Classes para entrada/sada de dados (arquivos, terminal)

    ada classe identificada unicamente pelo seu nome completo, que o nome do pacote mais o nome da classe. Poremplo, a classe java.util.ArrayList uma lista encadeada implementada com um vetor.

    cotes devem ter nomes "universalmente nicos". Ou seja, se voce colocar suas classes em um pacote, deve escolherm nome que ningum mais tenha usado. A regra usada para isso usar o URL da sua empresa/instituio como prefixo,

    trs pra frente. Por exemplo, poderamos usar o pacote br.pucminas ou at simplesmente pucminas.

    s pacotes so localizados pelo compilador atravs de um esquema de diretrios. As classes do pacote br.pucminasvem estar em um diretrio br/pucminas/dentro do CLASSPATH.

    ma classe que faa parte do pacote br.pucminas deve comear com a declarao package br.pucminas;

    ode-se referir a classes no mesmo pacote pelo nome curto (sem o pacote). Para no precisar se referir a classes detros pacotes pelo nome completo, pode-se importar as classes do pacote com a declarao import.

    port java.util.ArrayList; // Importa a classe ArrayListport java.io.*; // Importa todas as classes do pacote java.io

    xerccio 2 - Implementao Java

    objetivo desse exerccio nos (re)familiarizarmos com implementaes em Java, implementando classes com asguintes interfaces pblicas:

    blic class Ingrediente {public Ingrediente(String nome, float Quantidade); // Construtorpublic String getNome(); // Retorna o nomepublic float getQuantidade(); // Retorna a quantidade// Retorna um string no formato "ingrediente (quantidade)"// Por exemplo: "Farinha (4)"public String toString();

    blic class Receita {public Receita(String nome) // Construtor// Retorna uma lista com os ingredientes da receita (lista de// instncias da classe Ingrediente).public List ingredientes();// Acrescenta um ingrediente receitapublic void adicionaIngrediente(Ingrediente i);// Acrescenta um conjunto de ingredientes receitapublic void adicionaIngredientes(List ingredientes);// Verifica se possvel preparar a receita com um conjunto de ingredientes// Retorna verdadeiro se o conjunto passado como parmetro contiver todos// os ingredientes necessrios para o preparo, em quantidade suficiente.public bool possoPreparar(List ingredientes);

    // Retorna um string com todos os ingredientes, um por linha, sendo cada// ingrediente no formato especificado na classe Ingredientepublic String toString();// Retorna o nomepublic String getNome();// Programa main que demonstre todos os mtodos implementadospublic static void main(String[] args);

  • 8/7/2019 Programando em AspectoJ - JAVA

    8/32

    o permitido mudar a interface. Pode-se acrescentar membros privados quando necessrio.

    st uma interface - java.util.List. Sua implementao vai precisar de uma instncia concreta dessa interface, comova.util.ArrayList.

    ompilar e executar a classe Receita usando um compilador Java.

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 4 - Interesses entrecortantes

    s termos desenvolvimento estruturado e orientao a objetos dizem respeito modularidade do sistema. So formasstintas de se dividir um sistema em partes.

    diviso em partes importante para se reduzir a complexidade. muito difcil para um ser humano compreender umstema de grande porte se este for monoltico, sem fronteiras claras que definem suas funes.

    termo separao de interesses foi cunhado por Edsger Dijkstra em 1974 para denotar o princpio que guia a divisom partes: todo sistema de software lida com diferentes interesses, sejam eles dados, operaes, ou outros requisitos dostema. O ideal seria que a parte do programa dedicada a satisfazer a um determinado interesse estivesse concentradam uma nica localidade fsica, separada de outros interesses, para que o interesse possa ser estudado e compreendido

    m facilidade.

    desenvolvimento estruturado realizou a separao de interesses orientando-se atravs das diferentes funcionalidadeserecidas pelo software. Cada funo implementada em um nico mdulo, ou procedimento. Da surgiram conceitose ajudam a manter a separao de interesses, como o baixo acoplamento e a alta coeso.

    orientao a objetos veio como forma de sanar uma das deficincias do desenvolvimento estruturado. Apesar de

    teresses relativos a funcionalidades ficarem separados, interesses relativos a dados ficavam distribudos em diversosdulos. O paradigma OO definiu que a separao deveria acontecer em duas dimenses, primeiro dividido em termosdados e depois em termos das funes que utilizam cada tipo de dados.

    orientao a objetos melhorou as possibilidades de separao de interesses. No entanto, ainda tem deficincias nessaea. Os diagramas abaixo mostram uma representao grfica do cdigo do sistema Tomcat, um servidor web compacidade de executar servlets Java. Cada coluna representa um mdulo do sistema, sendo que o tamanho de cadaluna mostra o nmero proporcional de linhas de cdigo daquele mdulo. Como podemos ver no diagrama abaixo,guns interesses esto muito bem separados.

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    9/32

    (figura extrada e traduzida doAspectJ Tutorial, de Erik Hilsdale e outros)

    (figura extrada e traduzida doAspectJ Tutorial, de Erik Hilsdale e outros)

    o entanto, isso nem sempre verdade. Se considerarmos a funcionalidade de guardar registros para auditoria, isto ,gistrar as aes tomadas pelo servidor para se detectar violaes de segurana, erros, etc., ento vemos que o cdigo

    sponsvel por esse comportamento est espalhado por quase todos os mdulos.

    http://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppthttp://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppthttp://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppthttp://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppthttp://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppthttp://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppthttp://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppthttp://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppt
  • 8/7/2019 Programando em AspectoJ - JAVA

    10/32

    (figura extrada e traduzida doAspectJ Tutorial, de Erik Hilsdale e outros)

    a terminologia de orientao a aspectos, diz-se que a funo de registro para auditoria um interesse entrecortante,rque a sua implementao "corta" a estrutura de mdulos do sistema. Praticamente todo programa orientado a objetoso-trivial contm interesses entrecortantes.

    objetivo do desenvolvimento orientado a aspectos encapsular interesses entrecortantes em mdulos fisicamenteparados do restante do cdigo. Esses mdulos so denominados aspectos. Pensando em termos abstratos, a orientao

    aspectos introduz uma terceira dimenso de decomposio. Alm de decompor o sistema em objetos (dados) e mtodosunes), decompomos cada objeto e funo de acordo com o interesse sendo servido e agrupamos cada interesse emm mdulo distinto, ou aspecto.

    xerccio

    crescentar persistncia classe "Receita" desenvolvida no ltimo exerccio. A persistncia deve funcionar da seguinterma:

    http://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppthttp://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppthttp://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppthttp://www.parc.com/research/csl/projects/aspectj/downloads/OOPSLA2002-demo.ppt
  • 8/7/2019 Programando em AspectoJ - JAVA

    11/32

    O objeto s pode ser criado com o construtor que recebe como parmetro o nome da Receita; ao ser criado, oobjeto deve carregar do disco todos os dados relativos receita, se ela j existir.

    Toda vez que for alterado ou acrescentado algum dado receita, o dado deve ser imediatamente gravado emdisco.

    oc pode usar sua implementao feita para o ltimo exerccio como ponto de partida, ou pode usar as seguintesmplementaes:Receita.java e Ingrediente.java.

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 5 - Exemplo prtico

    onsidere um buffer de nmeros inteiros, isto , uma estrutura de dados compartilhada entre diversos processos, sendoe alguns escrevem dados no buffer e outros lem e removem os dados.

    um processo tenta ler dados do buffer vazio, ele bloqueado at que haja algum elemento no buffer. Da mesmarma, se um processo tenta escrever em um buffer cheio, ele bloqueado at que algum leia algum elemento.

    figura abaixo mostra os mtodos "ler" e "escrever" do buffer. Podemos dividir cada um desses mtodos em trs partes:parte que lida com o que fazer quando o buffer est vazio (poltica de buffer vazio), a parte que lida com o que fazerando o buffer est cheio (poltica de buffer cheio) e a parte que lida com o funcionamento normal do buffer, que dize os elementos devem ser lidos na mesma ordem que so lidos (poltica FIFO).

    a terminologia de POA, dizemos que cada poltica est espalhada por diversos mtodos. Analogamente, dizemos queda mtodo contm um entrelaamento de diversas polticas. Em POA, tentamos agrupar funcionalidades espalhadas

    m entidades separadas, de forma a minimizar o entrelaamento presente em cada mtodo.or exemplo, abaixo temos duas dessas polticas separadas e agrupadas em um mdulo fictcio chamado "concern"nteresse). Cada mtodo contm apenas a parte da operao que diz respeito poltica em questo. Para obtermos aerao completa, no entanto, precisamos de alguma forma de unir os mdulos.

    http://www.inf.pucminas.br/professores/torsten/code/Receita.javahttp://www.inf.pucminas.br/professores/torsten/code/Receita.javahttp://www.inf.pucminas.br/professores/torsten/code/Ingrediente.javahttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.inf.pucminas.br/professores/torsten/code/Receita.javahttp://www.inf.pucminas.br/professores/torsten/code/Ingrediente.javahttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    12/32

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 6 - Anatomia de linguagens orientadas a aspectos

    omposio de partesparadigma de orientao a aspectos envolve duas etapas de trabalho. A primeira a decomposio do sistema emrtes no entrelaadas e no espalhadas --- essa a parte fcil. A segunda envolve juntar essas partes novamente derma significativa para se obter o sistema desejado. O processo de juntar as partes se chama composio. H trsestes a serem definidas em qualquer linguagem orientada a aspectos para se fazer a composio: a correspondncia, amntica composicional, e o tempo de ligao.

    correspondncia - A forma de correspondncia da linguagem o modo com o qual se descreve quais entidadessero compostas entre si. A correspondncia pode ser implcita (determinada por regras da linguagem) ouexplcita (descrita pelo programador). Por exemplo, no exemplo acima que mostra duas polticas, podemos dizerque h uma correspondncia implcita entre eles - os mtodos com os mesmos nomes esto relacionados.

    semntica composicional - o que deve acontecer com os elementos que correspondem. Em geral, linguagensde POA modificam a semntica das chamadas a mtodos:

    Em linguagens procedurais, chamar a funo F implica em executar a funo F. Em linguagens orientadas a objetos, chamar o mtodo M implica em executar algum mtodo M em uma

    das subclasses que definem M. Em linguagens orientadas a aspectos, chamar o mtodo M pode ter diversas consequncias:

    M executado, ou N (algum outro mtodo) executado, ou M+N so executados, em alguma ordem definida

    A linguagem pode definir diversas semnticas diferentes que em geral so escolhidas pelo programador. No

    exemplo da ltima aula, uma linguagem de POA permitiria que o usurio definisse o que acontece com osmtodos que tm o mesmo nome (ou seja, que correspondem): se um for chamado, os dois devem serexecutados? em que ordem? apenas um deve ser executado? qual?

    tempo de ligao - diz respeito ao momento em que a correspondncia passa a surtir efeito; pode ser esttico (emtempo de compilao) ou dinmico (em tempo de execuo).

    ferramenta ou compilador que faz a composio dos elementos em POA chamado weaver (tecelo), pois "tece" os

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    13/32

    rios fragmentos de programa em um programa nico.

    forma de composio das partes o que realmente distingue linguagens orientadas a aspectos de outras linguagens.m linguagens procedurais ou orientadas a objetos, a composio feita atravs de chamadas de procedimentos outodos. Ou seja, uma parte (por exemplo, uma classe) usa a funcionalidade de outra chamando um mtodo.

    m POA, no h chamadas explcitas de mtodos entre partes. Ao invs disso, especifica-se, em uma parte separada,mo uma parte deve reagir a eventos que acontecem em outra parte. Essa estratgia reduz o acomplamento entre asrtes, pois as partes no se acessam diretamente.

    enefcios da programao orientada a aspectos

    Menos responsabilidades em cada parte - Como interesses entrecortantes so separados em seus prpriosmdulos, as partes do programa que lidam com a lgica de negcios no ficam poludas com cdigo que lida cominteresses perifricos.

    Melhor modularizao - Como os mdulos em AOP no se chamam diretamente, h uma reduo no nvel deacomplamento.

    Evoluo facilitada - Novos aspectos podem ser acrescentados facilmente sem necessidade de alterar o cdigoexistente

    Mais possibilidades de reutilizao - Como o cdigo no mistura interesses, aumentam-se as possibilidades de sereutilizar mdulos em sistemas diferentes.

    itos e realidades da programao orientada a aspectos

    difcil seguir a lgica de programas orientados a aspectos - Verdadeiro. Como um mdulo no chama outrodiretamente, difcil inferir o comportamento do sistema como um todo avaliando-se mdulos individuais. Noentanto, esse mesmo fato torna mais fcil a compreenso de cada mdulo isoladamente, pois ele no misturaoutros interesses.

    A POA no resolve nenhum problema novo - Verdadeiro. A POA no tenta resolver problemas no solucionados.H outras solues para os problemas de espalhamento e entrelaamento que no envolvem a criao de novastecnologias. Por exemplo, h padres de projeto (design patterns) que atacam problemas semelhantes, como opadro Strategy.

    A POA incentiva projetos mal feitos - Falso. Solues orientadas a aspectos no so a cura para programas ruins,so apenas ferramentas que fornecem novas formas de resolver problemas em reas onde a orientao a objetos deficiente. Na verdade, para se usar a POA com sucesso preciso muito esforo no desenvolvimento do projeto.

    A POA no necessria pois com interfaces abstratas resolve-se os mesmos problemas em OO - Falso. De fato, amelhor forma de se resolver o problema de interesses entrecortantes em sistemas OO usando interfacesabstratas que vo implementar esses interesses. Apesar dessa abordagem ser muito usada em projetos OO, ainda necessrio que o restante do cdigo chame os mtodos fornecidos pelas interfaces abstratas. Ou seja, o problema diminudo, mas no resolvido.

    A POA quebra o encapsulamento - Verdadeiro. Porm, as violaes de encapsulamento so teis se usadas demaneira controlada. Veremos mais sobre isso em uma aula futura.

    A POA vai substituir a orientao a objetos - Falso. A orientao a aspectos uma tecnologia complementar

    orientao a objetos e no funciona sem esta. As vrias partes que compem um programa orientado a aspectosainda so implementadas dentro do modelo OO.

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 7 - O compilador, o IDE eclipse e um primeiro aspecto

    compilador

    ogramas orientados a aspectos precisam de um compilador especfico. No caso da linguagem AspectJ, o compiladorc transforma um programa escrito em AspectJ em um programa em bytecode Java, que pode ser executado poralquer mquina virtual Java (JVM).

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    14/32

    IDE Eclipse

    Eclipse um IDE (Integrated Development Environment, ou ambiente integrado de desenvolvimento) gratuito,oduzido pela IBM, totalmente desenvolvido usando tecnologia Java.

    Eclipse extensvel atravs de plugins. Existem inmeros plugins disponveis. Um deles, o AJDT, fornece suporte aosenvolvimento com o AspectJ. As telas a seguir ilustram o uso do Eclipse com o AspectJ (as telas mostram o Eclipserso 3.0; o laboratrio da PUC tem a verso 2.1, ento espere que haja pequenas diferenas).

    stalao do AJDT

    Ver as instrues originais em ingls, ou siga os passos abaixo Eclipse 3.0

    Selecionar Help->Software Updates->Find and Install Entre com o nome "AJDT" e o URL http://download.eclipse.org/technology/ajdt/30/update Clique OK Abra (clicando no +) o nodo que aparece e selecione AspectJ. Clique next. Selecione Eclipse AspectJ

    Development Tools 1.1.12 Clique next, clique na opo de "I accept..." e siga com a instalao at o final.

    Eclipse 2.1 Selecionar Help->Software Updates->Update Manager Clique com o boto da direita no painel "Feature Updates" e selecione New->Site Bookmark, do menu

    que aparece. Entre com o nome "AJDT" e o URL http://download.eclipse.org/technology/ajdt/update Clique Finish Abra (clicando no +) o nodo que aparece (AJDT) e selecione AspectJ. Abra novamente (no +) e

    selecione Eclipse AspectJ Development Tools 1.1.4 Clique "Install now..." no painel da direita.

    ra comear a desenvolver um sistema em AspectJ, preciso primeiro criar um projeto. Para isso, selecione File-New->Project. Dentre as opes que aparecem, selecione "AspectJ Project".

    http://eclipse.org/http://eclipse.org/http://www.eclipse.org/ajdt/http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/org.eclipse.ajdt/AJDT1.1src/org.eclipse.ajdt/doc/AJDTug/ajdt-installation.htmhttp://eclipse.org/http://www.eclipse.org/ajdt/http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/org.eclipse.ajdt/AJDT1.1src/org.eclipse.ajdt/doc/AJDTug/ajdt-installation.htm
  • 8/7/2019 Programando em AspectoJ - JAVA

    15/32

    m projeto AspectJ tem classes Java comuns e aspectos. Vamos acrescentar os arquivos Receita.java e Ingrediente.javaprojeto. Para isso, preciso selecionar File->New->Class e entrar com o nome da classe que se quer criar. O Eclipse

    iar uma classe em branco. Como j temos a classe feita, podemos copiar-e-colar o corpo da classe para dentro dombiente do Eclipse.

    ndo criado as duas classes, podemos execut-las e ver seu resultado. O Eclipse 3.0 compila as classestomaticamente, mas no Eclipse 2.1 preciso compilar as classes usando Project->Rebuild All. Para executar asasses, s selecionar no painel "Package explorer" a classe que se quer executar (ou seja, a que define o mtodo main; nosso caso, a classe Receita) e selecionar Run->Run As...->Java Application. O resultado aparece no painel

    Console".

    gora pode-se acrescentar aspectos ao projeto. Para tanto, basta incluir, por exemplo, os arquivosCabecalho.aj,ormalizaCaixa.aj, e Debug.aj. Depois s compilar (Eclipse 2.1) e executar novamente a classe receita. Note que ada modificada pelos aspectos simplesmente por terem sido includos, sem ter de mudar as classes Receita ougrediente.

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 8 - Viso geral do AspectJ

    ementos do AspectJ

    Pontos de juno (join points) - um ponto de juno qualquer ponto identificvel pelo AspectJ durante aexecuo de um programa. O AspectJ permite diversos tipos de pontos de juno: entradas e sadas de mtodos,tratamento de excees, acessos a variveis de objetos, construtores, entre outros.

    Pontos de corte (pointcuts) - pontos de corte so construes de programa que permitem a seleo de um oumais pontos de juno. Pode-se usar expresses regulares para se especificar os pontos de corte, permitindogrande flexibilidade.

    http://www.inf.pucminas.br/professores/torsten/code/receita.javahttp://www.inf.pucminas.br/professores/torsten/code/ingrediente.javahttp://www.inf.pucminas.br/professores/torsten/code/cabecalho.ajhttp://www.inf.pucminas.br/professores/torsten/code/cabecalho.ajhttp://www.inf.pucminas.br/professores/torsten/code/normalizacaixa.ajhttp://www.inf.pucminas.br/professores/torsten/code/debug.ajhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.inf.pucminas.br/professores/torsten/code/receita.javahttp://www.inf.pucminas.br/professores/torsten/code/ingrediente.javahttp://www.inf.pucminas.br/professores/torsten/code/cabecalho.ajhttp://www.inf.pucminas.br/professores/torsten/code/normalizacaixa.ajhttp://www.inf.pucminas.br/professores/torsten/code/debug.ajhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    16/32

    Advice - advice, ou "conselho", um trecho de cdigo que deve ser executado em pontos de juno selecionadospor um ponto de corte. O advice pode ser executado antes, depois, ou "em volta" (around) do ponto de juno. Oaround pode ser usado para substituir o ponto de juno pelo advice, ou para executar cdigo antes e depois doponto de juno.

    Introdues (introduction) - uma introduo uma forma de um aspecto introduzir mudanas em classes,interfaces e aspectos do sistema. Por exemplo, pode-se acrescentar uma varivel ou mtodo a uma classeexistente.

    Aspectos - o aspecto a unidade modular principal em AspectJ, assim como a classe a unidade principal emJava. Um aspecto agrupa pontos de corte, advice, e introdues.

    guns Aspectos

    elemento principal do AspectJ o aspecto. Cada aspecto assemelha-se a uma classe e pode ter tudo que uma classem: definies de variveis, mtodos e restrioes de acesso. Alm desses elementos, no entanto, aspectos podem tertros elementos. Os dois tipos principais de elementos no AspectJ so pointcuts ("pontos de corte") e advice

    conselhos").

    ontos de corte so definies de instantes durante a execuo de um programa. Os pontos de corte no tem nehummportamento; so definies de correspondncia (ver aula 6). Eles denotam onde e quando os aspectos tero efeito noograma como um todo.

    m advice um comportamento. Ele especifica no s o que ser feito, na forma de uma sequncia de operaes Java,

    as tambm o momento em que sero feitas as operaes. Todo advice relacionado a um ou mais pontos de corte.

    ejamos um exemplo de aspecto simples. O aspecto a seguir define um ponto de corte que equivale a uma chamada aotodo printda classe Receita. O asterisco no pointcut denota que o ponto de corte se refere a qualquer tipo de retorno, seja, ele se refere ao mtodo Receita.print(), no importa qual o tipo do valor retornado pelo mtodo.

    blic aspect Cabecalho {// Ponto de cortepointcut cabecalho() : call (* Receita.print());

    // Advicebefore() : cabecalho() {

    System.out.println("-------RECEITA DA COZINHA INTELIGENTE-------");

    }

    m do ponto de corte, o aspecto define um advice do tipo before (antes). Alm disso, ele se refere ao pointcut definidoteriormente. Isso significa que o programa definido dentro do advice ser executado antes do instante definido pelointcut. Como o ponto de corte define o instante da chamada ao mtodo print() da classe Receita, o advice define quetes de cada chamada desse tipo ser impressa uma mensagem.

    compilador AspectJ verifica se existe ou no um ponto de corte que case com o definido dentro do aspecto e geradigo para aplicar o advice no local apropriado. A mudana no programa automtica. A classe Receita executada e,m que haja nenhuma referncia ao aspecto, este executado no instante definido pelo pointcut.

    utros aspectos podem ser acrescentados ao projeto da mesma forma. O aspecto a seguir define um ponto de corte quegloba todos os mtodos toString() de todas as classes. O advice presente nele do tipo around, que significa que odigo do advice ser executado ao invs do mtodo chamado, ou seja, o mtodo toString chamado no executado, e

    m o cdigo do advice. Este, por sua vez, chama o mtodo proceed() (prosseguir), que uma palavra-chave do AspectJe executa o mtodo que foi substitudo. Nesse exemplo, o objetivo chamar o mtodo toString() correspondente aopecto e guardar seu resultado na varivel s. Depois disso, o mtodo converte o string recebido em letras minsculasando toLowerCase() e retorna o string convertido para o mtodo que chamou toString() originalmente.

    blic aspect NormalizaCaixa {pointcut string() : call (* *.toString());

    String around() : string() {

    String s = proceed();return s.toLowerCase();

    }

    ltimo aspecto, chamado Debug, define um ponto de corte que inclui todos os mtodos do sistema, exceto os doprio aspecto Debug. O advice associado do tipo after, que executa aps terminar a execuo do mtodo

    http://www.inf.pucminas.br/professores/torsten/aulas/aula06.htmlhttp://www.inf.pucminas.br/professores/torsten/aulas/aula06.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    17/32

    rrespondente no ponto de corte. O advice usa a tcnica da introspeco (ou reflexo), uma tecnologia que permite quem programa descubra fatos sobre sua prpria estrutura. Nesse caso, o aspecto est verificando o nome do mtodo quei chamado e aps o qual o advice est executando. Ele ento imprime uma mensagem com o nome do mtodo.

    blic aspect Debug {pointcut debug() : call(* *.*(..)) && !within(Debug) && !within(NormalizaCaixa);

    after() : debug() {

    String nomeMetodo = thisJoinPointStaticPart.getSignature().getName();System.out.println("DEBUG: Saindo do metodo " + nomeMetodo);

    }

    compilador AspectJ gera bytecode com os aspectos entremeados entre as classes. S para ter uma idia de como seriasada do compilador se este transformasse os aspectos em Java puro, seria algo assim, no caso do primeiro aspecto,

    Cabealho":

    blic class Cabecalho {void before$print( ) {

    System.out.println("-------RECEITA DA COZINHA INTELIGENTE-------");}

    blic class Receita {

    Cabecalho c;

    ... // parte da classe removidapublic Receita() { // construtor

    c = new Cabecalho();}

    public void print() {

    c.before$print();System.out.println(this.toString());

    }

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 9 - Pontos de juno

    m ponto de juno qualquer ponto identificvel pelo AspectJ durante a execuo de um programa. Aspectos podemr associados a pontos de juno e executados antes, depois, ou ao invs deles. Existem diversos pontos de junoconhecidos pelo AspectJ:

    MtodosExistem dois tipos de pontos de juno relacionados a mtodos: pontos de chamada de mtodos e pontos deexecuo de mtodos

    Chamada de mtodos - So os pontos indicativos de onde, no cdigo, o mtodo chamado. Execuo de mtodos - o corpo dos mtodos propriamente ditos.

    Por qu precisamos de dois pontos de juno diferentes? No bastaria um desses? Eles no so equivalentes?Na verdade, h uma diferena: como em linguagens orientadas a objetos existe polimorfismo, possvelchamarmos um mtodo de uma classe e executarmos um mtodo de uma de suas subclasses. Assim, til fazer adistino em se tratando de aspectos. Alm disso, como a chamada e execuo podem estar em arquivosfisicamente diferentes, pode-se gerar pontos de corte compostos onde a diferena entre chamada e execuotorna-se mais importante.

    Construtores

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    18/32

    Assim como mtodos, construtores tm dois pontos de juno: um para chamadas ao construtor e outro para aexecuo do construtor. Pontos de juno de chamada de construtores so encontrados em locais onde um objeto instanciado com comandos new. Pontos de juno de execuo de construtores so o prprio cdigo doconstrutor.

    Acesso a camposExiste um ponto de juno em cada acesso aos dados de uma classe. Os pontos so divididos em pontos deleitura, onde o dado usado mas no modificado, e pontos de escrita, onde o dado modificado.

    importante notar que s h pontos de juno em dados declarados no escopo da classe. No h pontos de

    juno para variveis locais a mtodos.

    Tratamento de exceesUm ponto de juno de tratamento de excees o interior de um bloco catch que 'captura' algum tipo deexceo.

    Inicializao de classesSo pontos de juno que representam o instante em que uma classe carregada na memria e seus dadosestticos so inicializados.

    H outros tipos de pontos de juno menos usados: inicializao de objetos, pr-inicializao de objetos, e

    execuo de advice.

    xerccio 05

    escrever trs casos em que aspectos podem ser usados para melhorar um sistema. Escrever um pargrafo, pelo menos,ra cada caso. Os casos devem ser precisos e especficos, ou seja, voc deve detalhar como seria a implementao compectos e deve descrever um sistema possivelmente real, no um sistema genrico.

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 10 - Pontos de corte (pointcuts)

    ntaxe bsica

    m ponto de corte (pointcut) uma construo sinttica do AspectJ para se agrupar um conjunto de pontos de juno.ua sintaxe bsica a seguinte (ilustrada com um exemplo):

    blic pointcut nome() : call (void Receita.print())

    A primeira parte a declarao de restrio de acesso - nesse caso, public, mas pointcuts podem ser private ouprotected.

    A palavra-chave pointcutdenota que estamos declarando um ponto de corte. Todo pointcut tem um nome qualquer, e pode receber parmetros - nesse caso, o pointcut no recebe parmetros. Depois dos dois pontos (:) obrigatrios vem o tipo dos pontos de juno agrupados pelo pointcut - nesse caso

    temos um pointcut do tipo call, que indica uma chamada de mtodo. Finalmente vem a assinatura do pointcut, uma especificao dos pontos de juno aos quais o pointcut se refere.

    aracteres especiais

    a descrio da assinatura, pode-se usar alguns caracteres especiais para incluir mais de um ponto de juno no pointcut.s caracteres so:

    aractere Significado

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    19/32

    * Qualquer sequncia de caracteres no contendo pontos

    .. Qualquer sequncia de caracteres, inclusive contendo pontos

    + Qualquer subclasse de uma classe.

    xpresses lgicas

    m pointcut pode conter vrias assinaturas ligadas atravs de operadores lgicos. Os operadores so:

    Operador Significado Exemplo Interpretao do exemplo

    ! Negao ! Receita Qualquer classe exceto Receita|| "ou" lgico Receita || Ingrediente Classe receita ou classe ingrediente

    && "e" lgico Cloneable && RunnableClasses que implementam ambas as interfaces Cloneable eRunnable

    ointcuts por tipo de ponto de juno

    vimos pointcuts do tipo call, que se refere a chamadas de mtodos. Alm desse, existem outros tipos, listados a seguirm suas sintaxes:

    ategoria de ponto de juno Sintaxe do pointcut

    hamada de mtodo ou construtor call(AssinaturaDoMetodo)

    xecuo de mtodo ou construtor execution(AssinaturaDoMetodo)

    nicializao de classe staticinitialization(Classe)

    eitura de dado de classe get(AssinaturaDoCampo)

    scrita de dado de classe set(AssinaturaDoCampo)

    ratamento de exceo handler(Exceo)

    ointcuts de fluxo de controle dois tipos de pointcuts que se referem a um conjunto de pontos de juno que ocorrem em um fluxo de controle. Umuxo de controle consiste de todos os comandos que so executados entre a entrada em um mtodo e a sada deste,clusive considerando comandos em outros mtodos chamados pelo primeiro.

    s dois pointcuts so cflow( ) e cflowbelow( ). A nica diferena entre eles que cflow( ) inclui entre os pontos de junosultantes o prprio ponto de juno dado como parmetro, enquanto cflowbelow( ) inclui apenas os pontos de junoe esto "abaixo" do ponto dado. A tabela abaixo mostra um exemplo de cada tipo:

    onto de corte Descrio

    low(call (* Receita.print())

    Todos os pontos de juno que ocorrem durante a chamada ao mtodo printda classe

    Receita, incluindo a prpria chamada.lowbelow(execution(voideceita.print())

    Todos os pontos de juno que ocorrem durante a execuo do mtodo printda classeReceita, NO incluindo a prpria execuo.

    ointcuts baseados na estrutura lxica

    ois tipos de pointcuts levam em considerao trechos do cdigo do programa, sem levar em considerao a execuo.primeiro within(Tipo). Esse pointcut inclui todos os pontos de juno dentro de uma classe ou aspecto passada comormetro. O segundo withincode(Mtodo), que inclui todos os pontos de juno dentro de um mtodo ou construtor.

    onto de corte Descrio

    ithin(Receita+)Todos os pontos de juno que ocorrem dentro da classe Receita ou de qualquer de suassubclasses.

    ithincode(*eceita.set*(..)

    Todos os pontos de juno que ocorrem dentro de mtodos da classe Receita cujos nomescomeam com "set".

  • 8/7/2019 Programando em AspectoJ - JAVA

    20/32

    ointcuts de objetos em execuo

    pointcut this(Classe) compreende todos os pontos de juno de um objeto que da classe dada ou de qualquerbclasse dela. A diferena para within basicamente que within calculado em tempo de compilao e this em tempoexecuo, e within no inclui subclasses.

    ointcuts condicionais

    pointcut if(condio) compreende todos os pontos de juno em que a condio for verdadeira, em tempo deecuo.

    xerccio em aula

    onsidere a seguinte classe:

    blic class ExemploPointcut extends Exemplo {String titulo;int dificuldade;

    ExemploPointcut() {

    titulo = new String("Exemplo de pointcut");dificuldade = 1;

    }

    ExemploPointcut(String s, int diff) {titulo = new String(s);

    dificuldade = diff;}

    void Resolver(int diff) {

    if (dificuldade == diff) {System.out.println("Resolvido!");

    }}

    creva declaraes de pointcuts para os seguintes pontos de juno:1. A execuo do mtodo Resolver dessa classe.2. Chamadas a de qualquer dos construtores dessa classe.3. Acessos para leitura varivel "dificuldade".4. Acessos para escrita de qualquer varivel.5. Chamadas a qualquer mtodo dessa classe ou da classe "Receita".6. Chamadas a qualquer mtodo que comece com "R" no sistema.7. Execues de mtodos que recebem um inteiro como parmetro.8. Tratamentos da exceo IOException em qualquer mtodo da classe "Receita".

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 11 - Advice

    pos de advice

    dvice uma estrutura que denota o que um aspecto deve fazer, ou seja, qual o comportamento do aspecto. Em termosais formais, o advice designa a semntica comportamental do aspecto. Todo advice est associado a um pointcut, quefine pontos de juno. H trs tipos de advice:

    1. before: executa antes do ponto de juno2. after: executa depois do ponto de juno3. around: executa "em volta" do ponto de juno; esse tipo de advice serve para substituir a execuo do ponto de

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    21/32

    juno pela execuo do advice, ou executar parte do advice antes do ponto e juno e outra parte depois.

    odos os tipos de advice so definidos de forma semelhante:

    fore(): // declarao do adviceponto_de_corte() { // ponto de corte associado

    System.out.println("teste"); // corpo do adviceSystem.out.println("tchau");

    }

    dvice do tipo before

    advice do tipo before o mais simples: ele simplesmente executa antes do ponto de juno. O nico detalhe a seservar que se o advice levantar uma exceo, o ponto de juno no ser executado.

    dvice do tipo after

    advice do tipo after executa aps o ponto de juno. Existem trs variaces desse advice, que dependem de comorminou a execuo do ponto de juno: se terminou normalmente, com uma exceo, ou de qualquer forma.

    fter() : ponto_de_corte() executa depois do ponto de juno, independente de como ele retornou

    fter() returning :onto_de_corte()

    executa depois do ponto de juno se ele tiver terminado normalmente (semexceo)

    fter() throwing : ponto_de_corte() executa depois do ponto de juno somente se este tiver sado com uma exceo

    anto a forma returning quanto a throwing podem definir um parmetro que conter o valor retornado ou a exceogada, para ser usada pelo aspecto. Por exemplo:

    ter() returning(String s) : call(* Receita.getNome()) {System.out.println("O metodo retornou o string " + s);

    dvice do tipo around

    corpo de um advice around executado substituindo o ponto de juno. No entanto, o ponto de juno pode serecutado de dentro do corpo do advice usando-se o comando proceed( ).

    chamada a proceed( ) retorna o mesmo tipo retornado pelo ponto de juno substitudo. Alm disso, se o ponto deno um mtodo que espera receber argumentos, estes devem ser passados no proceed( ). Veremos como passar essesgumentos na seo seguinte.

    odo advice around deve declarar um tipo a ser retornado. O tipo deve ser o mesmo tipo dos pontos de junosociados a ele. Por exemplo, se o advice est associado chamada de um mtodo que retorna um inteiro, ele devetornar um inteiro. Todos os pontos de juno de um advice around devem retornar um tipo compatvel com o tipotornado pelo advice. Por exemplo:

    ring around() : call (* *.toString()) {

    String s = proceed();return s.toLowerCase();

    os pontos de juno retornam tipos diferentes, pode-se contornar isso declarando que o advice retorna Object. OspectJ cuidar para que o tipo correto seja retornado ao chamador, mesmo que o tipo seja um tipo primitivo.

    a mesma forma que tipos de retorno, o advice deve declarar que joga (throws) excees jogadas pelo mtodopturado.

    assagem de contexto

    aspecto pode usar informaes do ponto de juno capturado. Essa informao faz parte do contexto do ponto deno. dever do ponto de corte (pointcut) expor o contexto desejado para que o advice possa us-lo. Por exemplo,ponha que queiramos imprimir uma mensagem quando inserimos um ingrediente a uma receita, detalhando a operaoetuada:

    fore(Receita r, Ingrediente i) :call(void adicionaIngrediente(Ingrediente)) &&

  • 8/7/2019 Programando em AspectoJ - JAVA

    22/32

    target(r) &&args(i) {

    System.out.println("Inserindo ingrediente"+ i + " na receita "+ r.getNome() );

    }

    pointcut targetcaptura o objeto que o alvo da chamada de mtodo (o call especificado). O pointcut args captura osgumentos passados como parmetros (no caso, um objeto da classe Ingrediente). Pointcuts do tipo this tambm servemra capturar contexto. No caso, o this captura o objeto onde est o ponto de juno (o call, nesse caso). No exemplo,

    deramos substituir "this" por "target" e obter o mesmo efeito? Experimente!ointcuts j podem ser definidos com os parmetros desejados. Poderamos escrever o exemplo anterior da seguinterma:

    intcut insercao(Receita r, Ingrediente i) :call(void adicionaIngrediente(Ingrediente)) &&target(r) && args(i);

    fore(Receita r, Ingrediente i) : insercao(r, i) {System.out.println("Inserindo ingrediente"

    + i + " na receita " + r.getNome() );}

    xerccio

    uponha que a classe Receita tem um mtodo que conecte em um servidor e retorne uma lista com os ingredientes daceita, se ela existir. A interface do mtodo a seguinte:

    blic List getFromServer(Server s) throws RemoteException;

    o mtodo no conseguir se conectar ao servidor, ele causa uma exceo RemoteException. Agora suponha que vocabalha em um ambiente onde ocorrem problemas curtos, intermitentes e frequentes na rede. Sabendo que bem

    ovvel que ocorram problemas de conexo, mas que seriam temporrios, voc decide que uma boa poltica para sesolver o problema tentar novamente no caso de problemas.

    ua misso escrever um aspecto que tente ler do servidor at 10 vezes, esperando 2 segundos entre cada tentativa. Seo conseguir na dcima vez, ele passa a mesma exceo gerada pelo RemoteException para o chamador. Se conseguir,e retorna a lista retornada pelo servidor ao chamador.

    oc deve fazer tambm um mtodo que sirva para testar se o seu aspecto est funcionando. Note que voc no precisazer nenhum acesso rede pra testar!

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 12 - Introdues

    troduzindo novos membros em classes

    m de modificar o comportamento das classes de um sistema, um aspecto pode introduzir novos membros (dados outodos) a classes existentes. Esse mecanismo chamado de introduo.

    or exemplo, suponha que queremos um mecanismo para nos avisar quando o nvel de um ingrediente estiver baixo naspensa da casa. Suponha que a despensa tem um mtodo chamado usarIngrediente(Ingrediente i, int quantidade), queminui a quantidade em estoque do ingrediente desejado. Podemos incluir nosso mecanismo de aviso com o seguintepecto:

    blic aspect QuantidadeMinimaEmEstoque {

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    23/32

    private int Despensa.quantidadeMinima;public boolean Despensa.abaixoDoMinimo(Ingrediente i) {

    return i.getQuantidade >= quantidadeMinima;}

    after(Despensa d) : execution(Despensa.new(..)) && this(d) {

    d.quantidadeMinima = 3;}

    after(Despensa d, Ingrediente ing, int quantidade) :

    execution(* Despensa.usarIngrediente(Ingrediente, int)) &&

    args(ing, quantidade) && this(d) {if (d.abaixoDoMinimo(i)) {

    System.out.println("Comprar mais " + i.getNome());}

    }

    odificando a hierarquia de classes

    m de introduzir membros, o aspecto pode acrescentar relacionamentos de herana a classes existentes. As duasssibilidades so (ilustradas com exemplos):

    Fazer com que uma ou mais classes implementem uma ou mais interfaces:

    declare parents : Receita* implements Cacheable, Cloneable;

    (todas as classes que comeam com "Receita" vo implementar as duas interfaces enumeradas).

    Fazer com que uma ou mais classes sejam filhas de uma classe:

    declare parents : Ingrediente extends Comida;

    (a classe Ingrediente torna-se filha da classe Comida).

    nova hierarquia de classes s til no contexto dos aspectos, ou seja, como o restante do programa no sabe que as

    asses tm a hierarquia definida no aspecto, no podem fazer uso dela. No entanto, o aspecto pode. Alm disso, opecto no pode violar as regras de herana da linguagem Java, ou seja, uma classe no pode herdar de mais de umaasse. Portanto, a declarao de extends acima no pode ser usadas com classes que j herdam de alguma outra classe.

    troduzindo erros de compilao e warnings

    aspecto pode forar o compilador a apresentar erros caso algum ponto de juno seja encontrado. Isso til, poremplo, para verificar polticas estabelecidas de uso de programas terceiros. Suponha que o arquiteto do sistema tenhacidido que no se deve usar o tipo de dados ArrayList, por questes de desempenho. Ele pode validar o sistema com aguinte declarao em um aspecto:

    clare error: call(java.lang.ArrayList.new(..)) :"No permitido usar ArrayLists";

    o invs de declare error, pode-se usar declare warning para gerar um warning no compilador. Note que essasclaraes somente podem ser usadas com pointcuts resolvidos estaticamente, pelo compilador, ou seja, no podem serados com cflow ou cflowbelow, nem this, target, args, ou if.

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    24/32

    Aula 13 - Reflexo em Java

    que reflexo?

    eflexo ou introspeco a capacidade de um programa de investigar fatos sobre si prprio. Por exemplo, um objetode "perguntar" a outro quais os mtodos que ele possui. A linguagem de programao precisa oferecer recursos parae a reflexo seja possvel. A linguagem Java oferece esses recursos e o AspectJ oferece recursos adicionais para o usoreflexo em aspectos. O objetivo dessa aula dar uma viso geral dos mecanismos de reflexo da linguagem Java; a

    xima aula vai tratar de introspeco em AspectJ.

    classe Class

    oda classe Java que tem alguma instncia existe na memria na forma de uma instncia da classe Class. Essasstncias contm todas as informaes de uma classe - seu nome, dados, mtodos, etc - alm de mtodos para recuperarsas informaes. H trs formas de obtermos instncias da classe Class:

    1. Usando o mtodo getClass() em um objeto qualquer:Class class = r.getClass();

    2. Usando o sufixo .class em uma classe conhecida:Class class = java.io.FileReader.class;

    3. Usando o mtodo esttico Class.forName(String nome):

    Class class = Class.forName(stringComNomeDaClasse);e posse de um objeto do tipo Class podemos chamar os seguintes mtodos para obter mais informaes sobre a classelista a seguir apenas um pequeno subconjunto dos mtodos da classe Class):

    String getName() - retorna o nome da classe Object newInstance() - retorna um novo objeto que instncia da classe Method[] getMethods() - retorna uma lista de objetos da classe Method, representando os mtodos da classe Field[] getFields() - retorna uma lista de objetos da classe Field, representando os campos da classe Method getMethod(nome, tipos dos parmetros) - retorna o mtodo que tem o nome e parmetros dados, se

    existir.

    e posse de um objeto e um mtodo, podemos chamar o mtodo usando invoke, da classe Method:bject invoke(Object instncia, List argumentos)

    bserve a seguinte funo que recebe o nome de uma classe como parmetro e executa o mtodo print() dessa classe, see existir:

    static public void executaMetodoPrintDaClasse(String s) {try {

    Class c = Class.forName(s);Method m = c.getMethod("print", null);Object o = c.newInstance();m.invoke(o, null);

    } catch (Exception e) {

    System.out.println("Deu errado.");}

    }

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 14 - Reflexo em AspectJ

    vimos trs formas de capturar o contexto de um ponto de corte em tempo de execuo, usando as clusulas this(),rget() e args(). Alm dessas formas, possvel usar reflexo para descobrir detalhes sobre o ponto de juno que estndo tratado por um aspecto. Nessa aula veremos quais so as possibilidades oferecidas pelo AspectJ em termos deflexo. Note que a reflexo relativamente lenta, ento s devemos utiliz-la quando no for possvel obter a

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    25/32

    formao necessria usando this(), target() e args().

    xistem trs objetos que podem ser acessados de dentro de um advice, para determinar informaes sobre onde opecto est sendo executado:

    thisJoinPoint- contm informaes dinmicas sobre o ponto de juno. Os seguintes mtodos podem serchamados no objeto thisJoinPoint:

    Object[] getArgs() - retorna os argumentos da funo, semelhante ao que se obtm com o ponto de corteargs().

    Object getTarget() - retorna o objeto que foi alvo do ponto de corte, semelhante ao ponto de corte target()- por exemplo, no caso de uma chamada a mtodo, o alvo o objeto que recebe a chamada do mtodo.

    Object getThis() - retorna o objeto onde est o ponto de corte, semelhante ao ponto de corte this() - porexemplo, no caso de uma chamada a mtodo, o objeto aquele que est fazendo a chamada.

    getStaticPart() - retorna o objeto thisJoinPointStaticPart, descrito a seguir. thisJoinPointStaticPart- contm informaes estticas (nome, assinatura, etc.) sobre o ponto de juno. Os

    seguintes mtodos podem ser chamados no objeto thisJoinPointStaticPart: String getKind() - retorna um string com o tipo do ponto de juno (call, execute, set, handler, etc.) Signature getSignature() - retorna um objeto do tipo Signature, descrito mais abaixo, que contm a

    assinatura do mtodo relativo ao ponto de juno. SourceLocation getSourceLocation() - serve para descobrir a localizao do ponto de juno no cdigo

    fonte (arquivo, nmero da linha, etc.). No usaremos esse mtodo. thisJoinPointEnclosingStaticPart- contm informaes estticas (nome, assinatura, etc.) sobre o contexto que

    contm o ponto de juno. Por exemplo, se o ponto de juno uma chamada de mtodo, o contexto a execuodo mtodo onde feita a chamada. Esse objeto do mesmo tipo que o thisJoinPointStaticParte portanto tem osmesmos mtodos.

    ma das classes utilizadas na reflexo a classe Signature, que representa a assinatura de um ponto de juno. A classegnature tem diversas subclasses (que no estudaremos) especficas para mtodos, campos, excees, e assim porante. Alguns dos mtodos da classe so:

    Class getDeclaringType() - retorna uma instncia de Class que o tipo retornado pelo mtodo. String getName() - retorna o nome do ponto de juno (mtodo ou varivel).

    xemplo

    onsidere a seguinte adaptao do aspecto "Debug":

    blic aspect Debug {pointcut debug() : call(* *.*(..)) && !within(Debug);

    before() : debug() {

    String nomeMetodo = thisEnclosingJoinPointStaticPart.getSignature().getName();System.out.println("DEBUG: Metodo " + nomeMetodo);

    }

    onsidere agora a execuo do seguinte mtodo "main". Qual a sada do programa?

    blic class Receita {private List ingredientes;private String nome;

    // Acrescenta um ingrediente receitapublic void adicionaIngrediente(Ingrediente i) {

    ingredientes.add(i);}

    // Programa main que demonstra alguns dos mtodos implementadospublic static void main(String[] args) {

    Receita r = new Receita("bolo");r.adicionaIngrediente(new Ingrediente("FARINHA", 3));

    }

  • 8/7/2019 Programando em AspectoJ - JAVA

    26/32

    esposta:

    BUG: Metodo mainBUG: Metodo adicionaIngrediente

    se trocarmos o thisEnclosingJoinPointStaticPart por thisJoinPointStaticPart?

    BUG: Metodo adicionaIngredienteBUG: Metodo add

    xerccio

    ock objects so uma tcnica usada para se testar sistemas orientados a objetos. A idia substituir um objeto complexor uma verso "falsa" dele (mockquer dizer "maquete") que tem um comportamento simples e facilmente previsvel -r exemplo, retornando constantes em todos os mtodos. Suponha que tenhamos o seguinte mtodo na classe Receita:

    Carrega os dados da receita de um servidorid loadFromServer(Server s) {s.open();

    while (! s.endOfMessage()) {Ingrediente i = new Ingrediente(s.getString(), s.getInteger());adicionaIngrediente(i);

    }

    esume-se que a classe Server seja uma classe complexa que depende de inmeros fatores, como uma rede devidamentenfigurada, acessos remotos, etc. Para testarmos o mtodo loadFromServer sem precisarmos nos preocupar com essestalhes que so externos ao mtodo, substitumos a classe Server por uma classe mock:

    ass ServerMock {private static int contador = 1;public void open() { };public boolean endOfMessage() {

    if (contador++ == 3) {return false;

    } else {

    return true;}}public String getString() { return "TESTE"; }public int getInteger() { return 1; }

    parte chata de se usar mock objects que pra fazer os testes, precisamos trocar todos os lugares no programa onde aasse usada pela classe mock equivalente. Ou seja, no mtodo loadFromServer teramos de declarar o parmetro comoerverMock" ao invs de "Server".

    om aspectos, no entanto, podemos fazer essa substituio automaticamente, com algumas vantagens adicionais. Ojetivo desse trabalho desenvolver um aspecto para auxiliar os desenvolvedores no uso de mock objects. O aspectove se comportar da seguinte forma:

    Ao fazer qualquer chamada de mtodo, o sistema deve verificar se existe um mtodo mock equivalente. Mtodosmock tero a mesma assinatura que o mtodo verdadeiro e estaro em uma classe que tem o mesmo nome daclasse verdadeira, com a extenso "Mock" (como no exemplo acima, "Server" e "ServerMock").

    Se o mtodo mock existir, ele deve ser executado no lugar do mtodo verdadeiro. Se o mtodo mock no existir ou no puder ser executado por algum motivo, deve-se executar o mtodo

    verdadeiro.

    cas:

    Voc vai precisar de reflexo para resolver esse problema. Use as seguintes declaraes para importar asbibliotecas de reflexo:

    import org.aspectj.lang.reflect.*;import java.lang.reflect.*;

    A classe CodeSignature uma subclasse de Signature (ver acima) que define o mtodo "Class[]

  • 8/7/2019 Programando em AspectoJ - JAVA

    27/32

    getParameterTypes()", que retorna um vetor com as classes dos tipos dos parmetros do mtodo. Esse vetor servecomo argumento para o mtodo getMethod(nome, tipos_dos_parametros) da classe Class.

    Existe uma soluo para esse problema com um pointcut e um advice, com 10 linhas de cdigo no corpo doadvice. Outras solues tambm sero aceitas.

    eve-se entregar o aspecto e um programa que demonstre que o aspecto funciona.

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 15 - Precedncia entre aspectos

    que acontece quando dois "advice" se aplicam a um mesmo ponto de juno? Se esto declarados no mesmo aspecto,AspectJ d preferncia aos que esto declarados primeiro. Se esto em aspectos diferentes, de modo geral a ordem eme os dois advice so executados imprevisvel. No entanto, o AspectJ permite que se determine a ordem de execuoplicitamente.

    um advice A do tipo "before" tem precedncia sobre outro advice B do mesmo tipo, o A ser executado antes do B. Se

    dois fossem do tipo "after", o A seria executado depois do B, ou seja, o de maior precedncia vem por ltimo. Se osis fossem do tipo "around", o de maior precedncia seria executado e os outros no, a no ser que o mtodo proceed()ja chamado. O mesmo vale se um advice "around" tiver maior precedncia que outro do tipo "before" ou "after" - otro s ser executado se proceed() for chamado.

    rdenao de "advice" em um nico aspecto

    uando temos um nico aspecto com mais de um advice que se aplicam ao mesmo ponto de juno, os advice tmioridade conforme a ordem em que esto definidos dentro do aspecto. Por exemplo, se h um advice "before" definidotes de um advice "around", ambos aplicados ao mesmo ponto de corte, o "before" ser executado antes do "around". a ordem de definio deles for invertida, o "around" ser executado primeiro e o "before" s ser executado se o

    round" chamar proceed().

    rdenao explcita de "advice"

    ordenao feita definindo-se quais aspectos tm precedncia sobre outros. O AspectJ prov um comando para sefinir a precedncia:

    clare precedence: aspecto1, aspecto2, ...

    sa declarao quer dizer que os advice do aspecto aspecto1 tm precedncia sobre o aspecto2, o 2 sobre o 3, e assimr diante.

    s duas regras de precedncia devem ser combinadas quando necessrio. No exemplo anterior, se o aspecto2 tiver maisum advice, todos os advice do aspecto2 tero menor precedncia que os do aspecto1.

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 16 - Associaes entre aspectos e objetos

    or default, uma nica instncia de cada aspecto em um sistema criada quando o sistema executado, e essa instnciantinua a existir at que o sistema termine. No entanto, possvel fazer com que exista mais de uma instncia de umpecto.

    s instncias de aspectos nunca so criadas explicitamente pelo programador. So criadas sempre pelo prprio AspectJ edem estar associadas a alguma entidade do sistema. A associao define quando a instncia criada e quando ela deixa

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.html
  • 8/7/2019 Programando em AspectoJ - JAVA

    28/32

    existir, alm de determinar qual instncia usada quando um ponto de juno atingido. Alm da associao default,e de uma instncia por sistema, existem dois outros tipos de associao: por objeto e por fluxo de controle.

    ssociaes por objetos

    uando definimos que um aspecto deve ter uma instncia por objeto, a instncia criada automaticamente quando umjeto do tipo desejado criado. O aspecto fica associado ao objeto durante toda a vida do objeto, e usado sempre que

    gum dos pontos de juno do objeto for interceptado.

    dois tipos de associao por objeto, perthis(ponto_de_corte) e pertarget(ponto_de_corte). Ambos recebem um pontocorte como parmetro, que indica os pontos de juno que vo levar criao de uma instncia. A diferena entre eles

    a mesma diferena que existe entre os pontos de corte this() e target(): o perthis() se refere ao objeto onde est o pontojuno, e o pertarget() se refere ao objeto que alvo do ponto de juno.

    seguinte exemplo mostra a sintaxe das definies de associao e ser usado para ilustrar seu comportamento:

    blic aspect testaAssociacao perthis(execucoesReceita()) {pointcut execucoesReceita() : execution(* Receita.*(..));

    int x;

    // Construtorpublic testaAssociacao() { x = 0; }

    after() : execucoesReceita() {x = x+1;System.out.println("x = " + x);

    }

    executarmos a classe Receita com o seguinte main():

    Receita r1 = new Receita("bolo1");Receita r2 = new Receita("bolo2");r1.adicionaIngrediente(new Ingrediente("FARINHA", 3));r1.adicionaIngrediente(new Ingrediente("leite", 1));r2.adicionaIngrediente(new Ingrediente("FARINHA", 2));

    r2.adicionaIngrediente(new Ingrediente("leite", 1));

    bteremos a seguinte sada:

    = 1= 2= 1= 2

    bserve que existe um contador (x) distinto para cada um dos objetos do tipo Receita (r1 e r2). Se removermos ausula perthis() do aspecto acima e executarmos novamente o main(), teremos a seguinte sada:

    = 1= 2= 3= 4= 5

    ote que h apenas um contador para os dois objetos. Por que o contador chegou a 5 dessa vez, ao invs de 4? Porque onto de corte inclui o mtodo main( ). Por que ento o main( ) no foi considerado na primeira execuo? Porque oain( ) um mtodo esttico; mtodos estticos no pertencem a nenhuma instncia; como o aspecto est associadomente a instncias, o main( ) no tem um aspecto associado.

    ssociaes por fluxo de controle

    uando o aspecto associado a um fluxo de controle, uma instncia do aspecto criada assim que comea a execuo ponto de juno especificado, e removida quando o ponto de juno termina.

    dois tipos de associao por fluxo de controle, percflow(ponto_de_corte) e percflowbelow(ponto_de_corte). Sualicao semelhante aos pontos de corte cflow( ) e cflowbelow( ).

    trocarmos o perthis do exemplo acima por percflow, obteremos a seguinte sada:

  • 8/7/2019 Programando em AspectoJ - JAVA

    29/32

    = 1= 1= 1= 1= 1

    rogramao Orientada a Aspectos

    Pgina do autor |Dados do curso |Avaliao |Notas de aula | Links |

    Aula 17 - Aspectos e padres de projeto

    dres de projeto (design patterns) so modelagens de solues para pequenos problemas que aparecemequentemente durante a modelagem de sistemas orientados a objetos (pegue aqui uma apresentao PowerPoint sobredres de projeto).

    ada padro ilustrado atravs de um diagrama abstrato de classes. Por exemplo, abaixo temos o diagrama quemonstra o padro Observer:

    m problema com o uso de padres que os padres esto embutidos no cdigo, ou seja, podemos ver o padro comom interesse entrecortante. Seria interessante se pudssemos remover o padro do cdigo, na forma de um aspecto, elic-lo s classes que desejssemos sem termos de modificar essas classes. Nessa aula veremos um exemplo delicao de um padro usando aspectos. O escolhido ser o padro Observer, mostrado acima. Nossa soluo baseada

    m uma soluo encontrada em um artigo de Hannemann e Kiczales, "Design Pattern Implementation in Java andspectJ".

    icialmente, preciso deixar claro que no possvel implementar o padro Observer com o mesmssimomportamento do padro definido acima, pois no padro original cada observador "escolhe" qual o sujeito que vaiservar. impossvel fazermos essa "escolha" automaticamente. Assim, vamos implementar uma verso do Observer

    m que todos os observadores vo se ligar ao mesmo sujeito.

    ossa implementao usar pontos de corte abstratos. Esses so pontos de corte cuja definio ser feita em umabclasse do aspecto. O aspecto com o padro tem toda a parte genrica, mas teremos de criar um aspecto concreto parapecificar os observadores e sujeito especficos da nossa aplicao.

    mport java.util.*;

    http://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.inf.pucminas.br/professores/torsten/aulas/padroes_de_projeto.ppthttp://www.inf.pucminas.br/professores/torsten/aulas/padroes_de_projeto.ppthttp://www.cs.ubc.ca/~gregor/hannemann-OOPSLA2002-aop-patterns.pdfhttp://www.cs.ubc.ca/~gregor/hannemann-OOPSLA2002-aop-patterns.pdfhttp://www.aspectos.org/http://www.inf.pucminas.br/professores/torsten/index.htmlhttp://www.inf.pucminas.br/professores/torsten/avaliacao.htmlhttp://www.inf.pucminas.br/professores/torsten/cronograma.htmlhttp://www.inf.pucminas.br/professores/torsten/links.htmlhttp://www.inf.pucminas.br/professores/torsten/aulas/padroes_de_projeto.ppthttp://www.inf.pucminas.br/professores/torsten/aulas/padroes_de_projeto.ppthttp://www.cs.ubc.ca/~gregor/hannemann-OOPSLA2002-aop-patterns.pdfhttp://www.cs.ubc.ca/~gregor/hannemann-OOPSLA2002-aop-patterns.pdf
  • 8/7/2019 Programando em AspectoJ - JAVA

    30/32

    ublic abstract aspect PadraoObserver {protected interface Subject { }protected interface Observer {

    void update();}

    Subject sujeito;List observadores;

    abstract pointcut criarSujeito(Subject s);

    abstract pointcut criarObservador(Observer o);abstract pointcut modificarSujeito();after(Subject s) : criarSujeito(s) {

    if (sujeito == null) {sujeito = s;

    }}

    after(Observer o) : criarObservador(o) {

    observadores.add(o);}

    after() : modificarSujeito() {Iterator i = observadores.iterator();if (i.hasNext()) {

    Observer o = (Observer) i.next();o.update();

    }}

    gora precisamos implementar o aspecto concreto. Vamos usar como exemplo de sujeito uma classe MP3Player quepresenta um tocador de msicas MP3. Temos duas formas de aumentar o volume, um slider que movemos com oouse e um valor numerico da percentagem do volume mximo, que podemos editar. Mudar um deve necessariamente

    udar o outro. Por exemplo, se mexe