VinBR

PM 17/10

Oct 18th, 2011
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.10 KB | None | 0 0
  1. // notasdogarcia.blog.com
  2.  
  3. // Revisão
  4. // A prova é na segunda dia 24, a aula de quarta dia 19 é para exclarecimento de dúvidas.
  5.  
  6. CONCEITO Revisão:
  7. pointcut são os pontos que se deseja acessar no código.
  8.  
  9. CONCEITO Revisão:
  10. advices são os códigos que desejamos executar ao atingir os point cuts.
  11.  
  12. CONCEITO Revisão:
  13. Tipos de advices:
  14. - before -> executa antes do pointcut
  15. - after -> executa depois do pointcut
  16. - around -> substitui a chamada do pointcut pela chamada do advice.(normalmente voce vai adicionar essa chamada ao advice para não se perder o significado do código)
  17.  
  18. CONCEITO Revisão:
  19. proceed(); é uma função que é usada dentro de um advice do tipo around para chamar a função do pointcut.
  20. Assim voce pode usar o around e dentro dele chamar a função original.
  21.  
  22. CONCEITO Revisão:
  23. Tipos de advice2:
  24. - call, nesse caso o código do advice é inserido na função mãe do pointcut, ou seja, no ponto onde a função é chamada.
  25. - execution, nesse caso o advice é inserido dentro da própria função detectada como pointcut.
  26.  
  27. A principal diferença entre o call e o execution é que o escopo de cada um é diferente.
  28.  
  29. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  30.  
  31. Cruzando os dois tipos de advices e explicando o funcionamento de cada um:
  32.  
  33. call before: O advice é inserido antes da chamada da função no código da função mãe do pointcut.
  34. call after: O advice é inserido depois da chamada da função no código da função mãe do pointcut.
  35. call around: O advice substitui a função, e para isso deve-se usar proceed() para chama-la novamente permitindo que voce distribua o código ao redor do proceed.
  36.  
  37. execution before: O advice é inserido bem ao inicio do código da função do pointcut.
  38. execution after: O advice é inserido imediatamente antes do return da função do pointcut.
  39. execution around: O advice substitui todo o código da função.
  40.  
  41. Exemplo de chamada de uma função de um pointcut, e dos pontos onde cada tipo de advice entraria:
  42. No exemplo abaixo b() é a função do pointcut e a() é a função que chama b, ou seja a função mãe.
  43.  
  44. A.a()
  45. {
  46. ...
  47. // call before
  48. B.b(); // call around (substituindo a chamada)
  49. // call after
  50. ...
  51. }
  52.  
  53. B.b()
  54. {
  55. // execution before
  56. ... // execution around (subtituindo o código)
  57. // execution after
  58. }
  59.  
  60. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  61.  
  62. public aspect Nome
  63. {
  64. pointcut NomePoint1(): expressão regular;
  65.  
  66. pointcut NomePoint2(): expressão regular;
  67.  
  68. pointcut NomePoint3(): expressão regular;
  69.  
  70. ...
  71.  
  72. call before(int n): nome(parametros){
  73. código java normal
  74. }
  75.  
  76. long around(int n) : factoriaOperation(n){
  77. código java normal. esse é o advice.
  78. }
  79.  
  80. after(int n): nome(parametros){
  81. código java normal
  82. }
  83. }
  84.  
  85. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  86.  
  87. CONCEITO:
  88. Dois tipos especiais de exp. regular para pointcuts:
  89.  
  90. Como acessar os campos de uma classe em um pointcut? (ou seja como colocar um pointcut para funcionar durante a alteração ou leitura de uma variável de uma classe?)
  91. Para isso usa-se:
  92. set(campoDaClasse);
  93. get(campoDaClasse);
  94.  
  95. Exemplo:
  96.  
  97. pointcut alteraX(): set(int Point.x);
  98.  
  99. Assim sempre que houver uma alteração do valor do struct Point.x um advice será chamado.
  100.  
  101. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  102.  
  103. CONCEITO Revisão:
  104. target(f) é usado nas ER dos pointcuts, essa "função" irá coletar o objeto que chamou a função do pointcut, ou seja o "this" dessa função.
  105.  
  106. CONCEITO Revisão:
  107. args(a,b,c) também usado nas ER dos pointcuts coleta os parâmetros da função detectada pelo pointcut, se a função possuir mais de 3 parâmetros,
  108. os 3 primeiros são associados a a,b e c.
  109.  
  110. CONCEITO Revisão:
  111. this(t) é usado também nas ERs e tem o mesmo significado que o target() em advices do tipo execute.
  112. porém em advices do tipo call, é diferente, ela básicamente guarda em t, o valor do ponteiro "this" chamado no mesmo escopo do de inserção do pointcut.
  113.  
  114. Assim, se eu chamo this na função a() (do exemplo acima) eu receberei como retorno o struct A.
  115. E se faço isso na função b() recebo como retorno o struct B.
  116.  
  117. Exemplo de uso:
  118.  
  119. pointcut nomePoint1(f,a,b,c,t): expRegular && target(f) && args(a,b,c) && this(t);
  120.  
  121. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  122.  
  123. Agora suponha a função:
  124.  
  125. a.x()
  126. {
  127. return g.y();
  128. }
  129.  
  130. Suponha que eu queira saber o valor de a e de g? se eu usar um pointcut do tipo call, eu posso usar o this para receber o valor de a e o target para o valor de g.
  131.  
  132. Se voce chamar o this para um pointcut do tipo execution o seu valor na verdade será igual ao do target. portanto só faz sentido fazer isso para calls.
  133.  
  134. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  135.  
  136. // ( weaver é o nome do "compilador" dos aspectos )
  137.  
  138. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  139.  
  140. Um aspecto pode possuir atributos, ou seja declarar objetos:
  141.  
  142. private Map _factorialCache = new HashMap();
  143.  
  144. Essa declaração deve ser feita entre os pointcuts e os advices, já que será usada dentro dos códigos dos advices.
  145.  
  146. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  147.  
  148. Outra função especial para se usar nas ERs dos pointcuts:
  149.  
  150. cflowbelow(exp regular) detecta se na pilha de execução há uma chamada a essa função, isso é usado no pointcut.
  151.  
  152. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  153.  
  154. CONCEITOs Revisão:
  155. Transversalidade dinâmica:
  156. Isso é quando voce modifica o fluxo de execução de um programa.
  157. (é isso que temos feito mudando as funções)
  158.  
  159. Tranversalidade estática:
  160. É quando se redefine a estrutura estática do programa.
  161. Ou seja, voce pode mecher nas classes, adicionar implementações e extensões.
  162. // No caso parece que essas alterações só poderão ser usadas pelos advices de qualquer forma.
  163.  
  164. ex: de aspecto estatico:
  165.  
  166. aspect A
  167. {
  168. declare parents: SomeClass implements Runnable;
  169. public void SomeClass.run(){ .... };
  170. }
  171.  
  172. // Fim da aula.
  173.  
Advertisement
Add Comment
Please, Sign In to add comment