Introdução ao Paradigma Orientado a Aspecto Pontos de Junção (Join Points) São pontos bem definidos na execução de um programa, como a execução de um método, a execução de um construtor, o acesso a um atributo, a modificação do valor de um atributo, dentre outros. Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Identificando pontos de junção Produto -preco: double +getPreco(): double +setPreco(preco: double): void DVD DVDBox -Titulo: String -contagem: int -localizacao: String +getTitulo(): String +setTitulo(titulo: String): void +getContagem(): int +setContagem(contagem: int): void +getLocalizacao(): String +setLocalizacao(localizacao: String): void 1..* -titulo: String -titulosPacote: Vector -contagemTotal: int -localizacao: String 1 +criaDVDBox(nome: String): void +adicionaDVD(dvd: DVD): void +getLocalizacao(): String +setLocalizacao(localizacao: String): void Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Identificando pontos de junção Import java.util.Vector; Public class DVDBox extends Produto{ private String titulo; private Vector titulosPacote; private int vontagemTotal; private String localizacao; public DVDBox(String titulo){ } this.titulosPacote = new Vector(); this.contagemTotal = 0; this.titulo = titulo; } public void adicionarDVD dvd){ dvd.setStatus(this.localizacao, 1); titulosPacote.add(dvd); this.contagemTotal++; } public String getTitulo(){ return this.titulo; } public void setTitulo(String titulo){ this.titulo=titulo; } public String getLocalizacao(){ return this.localizacao; } public void setLocalizacao(String l){ this.localizacao = l; } Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Identificando pontos de junção Public class ExecutorLojaDVD { public static void main (String args[]){ DVD dvd1 = new DVD(“ O Senhor dos Anéis – Sociedade do Anel”); DVD dvd2 = new DVD(“ O Senhor dos Anéis – Torre Gêmeas”); DVD dvd3 = new DVD(“ O Senhor dos Anéis – O Retorno do Rei”); DVDBox box = new DVDBox(“ O Senhor dos Anéis – Trilogia Completa”); box.setTitulo(“O Senhor dos Anéis”); box.adicionarDVD(dvd1); box.adicionarDVD(dvd2); box.adicionarDVD(dvd3); } Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Ponto de Junção DVDBox box = new DVDBox(“Titulo”); • Chamada do construtor para criar o objeto a partir da classe DVDBox; • Recepção da chamada do construtor. conceitualmente um ponto de junção; Esse é considerado • Execução do código do construtor invocado; • Chamada para a construção de um vetor dentro da classe DVDBox; • Referente ao recebimento do comando para a criação de um objeto de vetor no construtor; • Execução do Objeto de Vetor; • Definição de valor para o atributo contagemTotal; • Definição do valor para o atributo título. Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Formas de Pontos de Junção • Ponto de junção – Chamada de métodos • Ponto de junção – Chamada para construtor • Ponto de junção - Execução de chamada de métodos • Ponto de junção – Acesso a Atributos • Ponto de junção – Definição de valores para atributos • Ponto de junção – Tratamento de exceções • Ponto de junção – Inicialização de classes e objetos Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Ponto de junção – Chamada de métodos Identifica a partir de qualquer chamada para qualquer método, ainda que a chamada seja feita por um objeto ou até mesmo por um método estático, como o método main(). Public static void main(String args[]){ DVDBox box = new DVDBox(“O senhor dos Anéis – Trilogia Completa”); box.setTitulo(“O Senhor dos Anéis”); } Pointcut defineTitulo() : call(public void setTitulo(String) && target(box)); Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Ponto de junção – Chamada para construtor É definido quando este é chamado durante a criação de um novo objeto, por meio de utilização da palavra new. Public static void main(String args[]){ DVDBox box = new DVDBox(“O senhor dos Anéis – Trilogia Completa”); } Pointcut chamadaConstrutor() : call(DVDBox.new(String)); Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Ponto de junção – Execução de chamada de métodos É definido quando um método é chamado em um objeto e o controle é, então, transferido para o método. Public static void main(String args[]){ DVDBox box = new DVDBox(“O senhor dos Anéis – Trilogia Completa”); box.setTitulo(“O Senhor dos Anéis”); } Pointcut recepcaoMetodoSetTitulo() : execution(public void setTitulo(String)) Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Ponto de junção – Acesso a Atributos É definido quando um atributo associado a um objeto é lido. Pointcut localizacaoget() : get(public String DVDBox.localizacao); Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Ponto de junção – Definição de valores para atributos É definido quando um atributo, associado a um objeto, tem o seu valor definido ou mesmo alterado. Pointcut localizacaoset() : set(public String DVDBox.localizacao); Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Ponto de junção – Tratamento de exceções Ocorre quando uma exceção for manipulada em um bloco catch. Pointcut handler(IOException); Ponto de junção – Inicialização de classes e objetos Pointcut inicializacaoEstatica : staticinicialization(DVDBox); Pointcut inicializacao : inicialization(DVDBox.new(String)); Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Pontos de Atuação (PointCut) São elementos da Orientação a Aspectos usados para definir um ponto de junção, como uma espécie de regra criada pelo programador para especificar eventos que serão atribuídos a esses pontos. Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Estrutura do ponto de atuação <pointcut> ::= <tipo de acesso> <nome do parâmetros> }) : { designador } [ && | || ] }; pointcut> ( {<lista de <tipo de acesso> ::= public | private [abstract] <nome do pointcut ::= { <identificador> } <parâmetros> ::= { <identificador> <tipo> } <designador> ::= [!]Call | execution | target | args | cflow | cflowbelow | staticinitialization | within | if | adviceexecution | preinitialization <identificador> ::= letter { letter | digit } <tipo> ::= tipos válidos do java Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Designadores do ponto de atuação Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Ponto de atuação Public class Mensagem{ public void exibeMensagem(){ System.out.println(“Olá Mundo – Versão AspectJ”); } public static void main(String args[]){ Mensagem msg = new Mensagem(); msg.exibeMensagem(); } } Public aspect AspectoMensagem { pointcut callExibeMensagem() : call(public void Mensagem.exibeMensagem(..)); before() : callExibeMensagem() { System.out.println(“Antes da chamada do método exibeMensagem()”); } after() : callExibeMensagem() { System.out.println(“Depois da chamada do método exibeMensagem()”); } } Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Adendo (advice) Contém o código que deverá ser executado quando o ponto de junção definido no ponto de atuação for capturado. Before() : criaMensagem(){ Systema.out.println(“Antes de instanciar Mensagem()”); } Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Estrutura de um Adendo (advice) Public aspect TesteRegistroAspecto{ // Parte 1 : especificação do ponto de atuação public pointcut chamadaRegistro() : call(public void print*(*)); //Parte 2 : declaração do adendo before() : chamadaRegistro(){ //Parte 3 : corpo do adendo System.out.print(“Imprimir o Nome de um Livro”); } } Prof. Carlos Eduardo Introdução ao Paradigma Orientado a Aspecto Os diferentes Tipos de Adendo (advice) Tipo de Adendo before Descrição Executa quando o ponto de atuação é alcançado, mas imediatamente antes da sua computação Executa após a computação com sucesso do after returning ponto de atuação after throwing Executa após a computação sem sucesso do ponto de atuação after Executa após a computação do ponto de atuação, em qualquer situação around Executa quando o ponto de junção é alcançado e tem total controle sobre a sua computação. Prof. Carlos Eduardo