como o aspectj tece o código cristóferson bueno thiago silva miranda seminário de inf640 –...

26
Como o AspectJ tece Como o AspectJ tece o código o código Cristóferson Bueno Cristóferson Bueno Thiago Silva Miranda Thiago Silva Miranda Seminário de INF640 – Linguagem de Seminário de INF640 – Linguagem de Programação Programação

Upload: internet

Post on 17-Apr-2015

102 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Como o AspectJ tece o Como o AspectJ tece o códigocódigo

Cristóferson BuenoCristóferson Bueno

Thiago Silva MirandaThiago Silva Miranda

Seminário de INF640 – Linguagem de ProgramaçãoSeminário de INF640 – Linguagem de Programação

Page 2: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Separação de Interesse;Separação de Interesse; Requisitos Transversais;Requisitos Transversais;

Aspecto e desenvolvimento de Aspecto e desenvolvimento de SoftwaresSoftwares

Page 3: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Boa ModularizaçãoBoa Modularização

Page 4: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Ausência de ModularizaçãoAusência de Modularização

Page 5: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Linguagem AspectJLinguagem AspectJ

•Pontos de Junção;Pontos de Junção;

•Pontos de Corte;Pontos de Corte;•Advice;Advice;•Inter-type Inter-type

declarations;declarations;•Aspectos.Aspectos.

Programação Orientada a Programação Orientada a AspectosAspectos

(Conceitual)

(Construção)

Page 6: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

aspect HistoricoMudancas {

pointcut saldoAlterado(): call(void Conta.setSaldo(BigDecimal));

after() returning: saldoAlterado() { <código a ser executado> }}

declaraçãodo aspecto

Programação Orientada a Programação Orientada a AspectosAspectos

Page 7: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

aspect HistoricoMudancas {

pointcut saldoAlterado(): call(void Conta.setSaldo(BigDecimal));

after() returning: saldoAlterado() { <código a ser executado> }}

declaraçãodo pointcut

Programação Orientada a Programação Orientada a AspectosAspectos

Page 8: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

aspect HistoricoMudancas {

pointcut saldoAlterado(): call(void Conta.setSaldo(BigDecimal));

after() returning: saldoAlterado() { <código a ser executado> }}

declaraçãodo advice

quando

Programação Orientada a Programação Orientada a AspectosAspectos

Page 9: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

CompiladoresCompiladores• ajcajc (compilador criado em 2001 pela (compilador criado em 2001 pela

Xerox PARC, e posteriormente Xerox PARC, e posteriormente liberado para Eclipse fundation);liberado para Eclipse fundation);

• abcabc (AspectBench Compiler - (AspectBench Compiler - compilador open source criado para compilador open source criado para permitir testes paras os novos permitir testes paras os novos recursos da linguagem);recursos da linguagem);

Programação Orientada a Programação Orientada a AspectosAspectos

Page 10: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

O que é weaving?O que é weaving?

•Processo que combina os módulos Processo que combina os módulos principais e transversais em um principais e transversais em um sistema final. Este processo é sistema final. Este processo é executado por um aspect weaver, executado por um aspect weaver, que é um compilador de aspectos.que é um compilador de aspectos.

““Aspect in Action”Aspect in Action”

Programação Orientada a Programação Orientada a AspectosAspectos

Page 11: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Programação Orientada a Programação Orientada a AspectosAspectos

Page 12: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Tipos de weavingTipos de weaving

• Compile-time: Inserir em tempo de Compile-time: Inserir em tempo de compilação;compilação;

• Post-compile: O aspecto é em Post-compile: O aspecto é em inserido em arquivos de classe ou inserido em arquivos de classe ou JAR;JAR;

• Load-time: Modificação do código Load-time: Modificação do código quando é carregado, Reflection.quando é carregado, Reflection.

Programação Orientada a Programação Orientada a AspectosAspectos

Page 13: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Preocupações para inserção de Preocupações para inserção de códigocódigo

• Onde – Join Point -> ShadowsOnde – Join Point -> Shadows• Quando – Point Cuts condicionais -> Quando – Point Cuts condicionais ->

ResíduosResíduos• O Quê – O Advice -> MungerO Quê – O Advice -> Munger• Como – WeavingComo – Weaving

Programação Orientada a Programação Orientada a AspectosAspectos

Page 14: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

O weaver (compilador de aspecto) O weaver (compilador de aspecto) deve manipular o bytecode para deve manipular o bytecode para inserir chamadas aos advices sempre inserir chamadas aos advices sempre que uma condição é encontrada.que uma condição é encontrada.

Para cada Sombra estática (static Para cada Sombra estática (static shadow), o wever verifica todos os shadow), o wever verifica todos os advices do sistema e avalia se o advices do sistema e avalia se o pointcut do adivce aplica-se à static pointcut do adivce aplica-se à static shadow.shadow.

Programação Orientada a Programação Orientada a AspectosAspectos

Page 15: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Programação Orientada a Programação Orientada a AspectosAspectos

Page 16: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

public static void main(String[] s) { System.out.println(“hello world”);}

0: getstatic [java/lang/System.out]

3: ldc [String “hello world”]

5: invokevirtual [java/io/Printstream.println]

8: return

Field-getTarget: from stackArgs: none

Method-callTarget: From stackArgs: From stack!Parameters must be stored and re-loaded

Method-executionTarget: thisArgs: local vars

– Sessões estáticas do código que representam um join point potencial

– Exemplo: “hello world”

Programação Orientada a Programação Orientada a AspectosAspectos

Shadowns - Shadowns - OndeOnde

Page 17: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Programação Orientada a Programação Orientada a AspectosAspectos

Shadowns - Shadowns - OndeOnde■ Bytecodes Java carregam bastante

meta-informação.• código fonte não precisa estar

disponível

■ As vezes, é impossível determinar estaticamente se um advice deverá ser executado.• resíduo

Page 18: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

■ Cada advice é compilado para um método java.• Executados no contexto de uma

instância de aspecto.• Informações adicionais armazenadas

em atributos.

■ Cada resíduo também é compilado para um método java.

Programação Orientada a Programação Orientada a AspectosAspectos

Shadown Munger Objects – O Shadown Munger Objects – O quêquê

Page 19: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

■ Advice são representados por shadow munger objects, cada qual contendo um designador de pointcut (PCD – Pointcut designator)

■ Quando um PCD depende de um estado dinâmico do ponto de junção a combinação é resolvida pela adição de um teste dinâmico, que captura a parte dinâmica. Este teste dinâmico é o resíduo da comparação.

Programação Orientada a Programação Orientada a AspectosAspectos

Resíduos (Matching – Residues) Resíduos (Matching – Residues) QuandoQuando

Page 20: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

■ Representam a parte dinâmica do pointcut

■ Tipos de resíduos:

• If■Computam condições nos parâmetros

• Instanceof■Checagem de tipo

Programação Orientada a Programação Orientada a AspectosAspectos

Resíduos (Matching – Residues) Resíduos (Matching – Residues) QuandoQuando

Page 21: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

■ Tipos de resíduos (cont.)

• Cflow■Armazenam e checam informações de entrada e saída de joint points em uma pilha local à thread.

■Cada joinpoint relevante deve checar o status.

■Teste completamente dinâmico■ Checagem estática muito complexa e de

utilidade contestável.

Programação Orientada a Programação Orientada a AspectosAspectos

Page 22: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Tecendo (weaving) o Código;Tecendo (weaving) o Código;

Uma simples classe JavaUma simples classe Javapublic class Hello {public class Hello {

void greeting(){void greeting(){

System.out.println("Hello!");System.out.println("Hello!");

}}

public static void main( String[] args ){public static void main( String[] args ){

new Hello().greeting();new Hello().greeting();

}}

}}

Programação Orientada a Programação Orientada a AspectosAspectos

Page 23: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Um exemplo de aspectoUm exemplo de aspecto

public aspect With {public aspect With {

before() : call( void Hello.greeting() ) {before() : call( void Hello.greeting() ) {System.out.print("> ");System.out.print("> ");

}}

}}

Programação Orientada a Programação Orientada a AspectosAspectos

Page 24: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

Resultado após código tecidoResultado após código tecido

public class Hello {public class Hello {

void greeting() { System.out.println("Hello!"); void greeting() { System.out.println("Hello!"); }}

public static void main( String[] args ) {public static void main( String[] args ) {Hello dummy = new Hello();Hello dummy = new Hello();

System.out.print("> ");System.out.print("> ");

dummy.greeting();dummy.greeting();

}}}}

Programação Orientada a Programação Orientada a AspectosAspectos

Page 25: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

O resultado final é bytecode java O resultado final é bytecode java puro;puro;

A aplicação final é um programa java A aplicação final é um programa java como qualquer outro;como qualquer outro;

Uma análise estática bem feita pode Uma análise estática bem feita pode resultar em um código mais rápido;resultar em um código mais rápido;

O aspecto ainda precisa de algumas O aspecto ainda precisa de algumas melhorias para resolver o problema melhorias para resolver o problema de performance do processo de de performance do processo de compilação.compilação.

ConclusãoConclusão

Page 26: Como o AspectJ tece o código Cristóferson Bueno Thiago Silva Miranda Seminário de INF640 – Linguagem de Programação

ReferênciasReferências

Aspectj In Action - Ramnivas Laddad Aspectj In Action - Ramnivas Laddad 20032003

Advice Weaving in AspectJ - Erik Advice Weaving in AspectJ - Erik Hilsdale; Jim HuguninHilsdale; Jim Hugunin

Programação Orientada a Aspectos - Programação Orientada a Aspectos - Vladimir Oliveira Di IorioVladimir Oliveira Di Iorio

AOP e Weaving em AspectJ – AOP e Weaving em AspectJ – Marcelo Marcelo Simões; Pedro OsandySimões; Pedro Osandy