You are on page 1of 31

Desenvolvimento

Orientado a Aspectos
rof. 1hlago vlana
Lamnv[reclfe.lfpe.edu.br
Advice
Advice
1lpos de !"#$%&
! ("#$%& e uma esLruLura que denoLa o que um aspecLo deve
fazer, ou se[a, qual o comporLamenLo do aspecLo. Lm
Lermos mals formals, o !"#$%& deslgna a semnuca
comporLamenLal do aspecLo. 1odo !"#$%& esL assoclado a
um )*$+,%-,, que dene ponLos de [uno.
Advice
1lpos de !"#$%&
! P Lrs upos de advlce:
! !"#$%": execuLa anLes do ponLo de [uno,
! &'"%: execuLa depols do ponLo de [uno,
! &%$()*: execuLa "em volLa" do ponLo de [uno, esse
upo de !"#$%& serve para subsuLulr a execuo do
ponLo de [uno pela execuo do !"#$%&, ou execuLar
parLe do !"#$%& anLes do ponLo e [uno e ouLra parLe
depols.
Advice
1lpos de !"#$%&
! 1odos os upos de !"#$%& so denldos de forma
semelhanLe:
before(): // declarao do advice
ponto_de_corte() { // pointcut associado
System.out.println("teste"); // corpo do advice
System.out.println("tchau");
}
Advice
("#$%& do 1lpo !"#$%"
! C !"#$%& do upo .&/*0& e o mals slmples: ele slmplesmenLe
execuLa anLes do ponLo de [uno.
Advice
("#$%& do 1lpo '("%
! C !"#$%& do upo !1&0 execuLa aps o ponLo de [uno.
! LxlsLem Lrs varlaes desse !"#$%&, que dependem de
como Lermlnou a execuo do ponLo de [uno: se
Lermlnou normalmenLe, com uma exceo, ou de qualquer
forma.
Advice
("#$%& do 1lpo '("%
! 1anLo a forma 0&,-0+$+2 quanLo a ,30*4$+2 podem denlr
um parmeLro que conLer o valor reLornado ou a exceo
[ogada, para ser usada pelo aspecLo. or exemplo:
after() : ponto_de_corte() executa depois do ponto de juno,
independente de como ele retornou
after() returning : ponto_de_corte() executa depois do ponto de juno se ele
tiver terminado normalmente (sem
exceo)
after() throwing : ponto_de_corte() executa depois do ponto de juno
somente se este tiver sado com uma
exceo
after() returning(String s) : call(* Receita.getNome()) {
System.out.println("O metodo retornou o string " + s);
}
Advice
("#$%& do 1lpo '%$)*+
! LsLe e o upo de !"#$%& mals poderoso e mals uullzado.
Com esse !"#$%& podemos lnLerferlr na execuo do
meLodo de forma que possamos:
! lmpedlr a execuo,
! Modlcar os parmeLros,
! Modlcar o reLorno,
! LevanLar um Lxcepuon,
! Lngollr um Lxcepuon.
Advice
("#$%& do 1lpo '%$)*+
! Lxemplo:
! no exemplo aclma o !"#$%& !0*-+" esL lnLercepLando o
meLodo soma de qualquer classe, esL lmprlmlndo uma
mensagem e reLornando 1.
int around(): call(public int *.*.soma(int,int)) {
System.out.println("Around advice modificando valores constante
1");
return 1;
}
Advice
("#$%& do 1lpo '%$)*+
! Como o advlce around esL denldo como lnL lsso Lorna
obrlgaLrlo o reLorno de um lnLelro. Lsse reLorno esL
hardcoded, mas poderla ser dlnmlco.
! Lsse advlce abre uma lmensa gama de posslbllldades.
! Cuando uullzamos around e necessrlo especlcar uma
slnLaxe um pouco dlferenLe dos ouLros advlces, denLre as
dlferenas exlsLe o proceed().
Advice
("#$%& do 1lpo '%$)*+
! ve[a no exemplo abalxo como podemos fazer lsso
uullzando o proceed():
! nesLe exemplo fol uullzado o recurso !025 para recuperar
os argumenLos do meLodo soma2 e esse argumenLos x, y
foram referenclados denLro do !"#$%& !0*-+".
! no nal e execuLado o )0*%&&" que execuLa o meLodo
real com os parmeLros.
int around(int x,int y): call(public int *.*.soma2(int,int)) &&
args(x,y){
System.out.println("Around advice modificando valores dinamicos");
return proceed(x,y);
}
Advice
("#$%& do 1lpo '%$)*+
ALeno:
! Cuando uullzamos !0*-+" como !"#$%& e de exLrema
lmporLncla uullzar o )0*%&&"678 mesmo quando o meLodo
e #*$". Se o )0*%&&"67 no for execuLado denLro do !"#$%&
!0*-+" o meLodo orlglnal no ser execuLado.
! s vezes voc pode querer fazer como forma de alguma
polluca de segurana, mas lembre-se: o meLodo no ser
execuLado.
Advice
("#$%& do 1lpo '%$)*+
! C corpo de um advlce around e execuLado subsuLulndo o
ponLo de [uno. no enLanLo, o ponLo de [uno pode ser
execuLado de denLro do corpo do advlce aLraves do
comando )0*%&&"6 7.
Advice
("#$%& do 1lpo '%$)*+
! A chamada a )0*%&&"6 7 reLorna o mesmo upo reLornado
pelo ponLo de [uno subsuLuldo. Alem dlsso, se o ponLo
de [uno e um meLodo que espera receber argumenLos,
esLes devem ser passados no )0*%&&"6 7.
Advice
("#$%& do 1lpo '%$)*+
! 1odo !"#$%& !0*-+" deve declarar um upo a ser reLornado.
! C upo deve ser o mesmo upo dos ponLos de [uno
assoclados a ele. or exemplo, se o advlce esL assoclado a
chamada de um meLodo que reLorna um lnLelro, ele deve
reLornar um lnLelro.
! 1odos os ponLos de [uno de um !"#$%& !0*-+" devem
reLornar um upo compauvel com o upo reLornado pelo
!"#$%&. or exemplo:
Advice
("#$%& do 1lpo '%$)*+
! or exemplo:
String around() : call (* Exemplo.getTitulo()) {
String s = proceed();
return s.toLowerCase();
}
Advice
assagem de conLexLo
! um aspecLo pode usar lnformaes do ponLo de [uno
capLurado.
! Lssa lnformao faz parLe do conLexLo do ponLo de [uno.
! L dever do )*$+,%-, expor o conLexLo dese[ado para que o
!"#$%& possa us-lo.
! or exemplo, suponha que quelramos lmprlmlr uma
mensagem quando lnserlmos um lngredlenLe a uma
recelLa, deLalhando a operao efeLuada:
Advice
assagem de conLexLo
! C )*$+,%-, ,'%-", capLura o ob[eLo que e o alvo da
chamada de meLodo (o call especlcado). C )*$+,%-, '%-.
capLura os argumenLos passados como parmeLros (no
caso, um ob[eLo da classe lngredlenLe).
before(Receita r, Ingrediente i) :
call(void adicionaIngrediente(Ingrediente)) &&
target(r) &&
args(i) {
System.out.println("Inserindo ingrediente"
+ i + " na receita + r.getNome() );
}
}
Advice
assagem de conLexLo
! 9*$+,%-,5 [ podem ser denldos com os parmeLros
dese[ados. oderlamos escrever o exemplo anLerlor da
segulnLe forma:
pointcut insercao(Receita r, Ingrediente i) :
call(void adicionaIngrediente(Ingrediente)) &&
target(r) && args(i);

before(Receita r, Ingrediente i) : insercao(r, i) {
System.out.println("Inserindo ingrediente"
+ i + " na receita " + r.getNome() );
}
}
Introdues
Introdues
lnLroduzlndo novos membros em classes:
! Alem de modlcar o comporLamenLo das classes de um
slsLema, um aspecLo pode lnLroduzlr dlnamlcamenLe novos
membros (dados ou meLodos) a classes exlsLenLes. Lsse
mecanlsmo e chamado de ,)-%$*(./$.
! Com esLe recurso podemos adlclonar aLrlbuLos a um classe
!ava e uullzar essa lnformao para algum processamenLo
em algum !"#$%& de um aspecLo.
Introdues
lnLroduzlndo novos membros em classes:
! ara adlclonar aLrlbuLos a uma classe !ava podemos fazer
conforme o exemplo abalxo:
! no exemplo aclma esL sendo adlclonda uma LlsL<orLa>
no ob[eLo casa. erceba que o aLrlbuLo esL sendo
adlclonado de forma prlvada, lsso slgnlca que no poder
ser acessada de fora do aspecLo.
private List<Porta> Casa.portas = new ArrayList<Porta>();
Introdues
lnLroduzlndo novos membros em classes:
! ara adlclonar meLodos a uma classe podemos fazer
conforme o exemplo abalxo:
! no cdlgo aclma fol adlclonado o meLodo plnLar ao ob[eLo
Casa, esse meLodo Lem como parmeLro um ob[eLo Cor,
esse meLodo pode ser acesslvel denLro de um advlce ou de
um ouLro aspecLo, pols o meLodo ser publlco.
public void Casa.pintar(Cor c){
System.out.println("Pintando a casa de cor:" + c);
}
Introdues
lnLroduzlndo novos membros em classes:
! CuLro recurso que podemos uullzar e a adlo de
consLruLores a classes !ava, conra o exemplo abalxo:
! no exemplo aclma fol adlclonado um consLruLor ao ob[eLo
Casa, esse ob[eLo agora Lem um consLruLor que recebe um
SLrlng conLendo a rua.
! A chamada super() e opclonal, mas o compllador AspecL!
lr lanar um warnlng se voc no a colocar. or quesLes
de boas prucas de programao recomenda-se uullzar.
public Casa.new(String rua) {
super();
System.out.println(rua);
}
Introdues
Modlcando a hlerarqula de classes:
! Alem de lnLroduzlr membros, o aspecLo pode acrescenLar
relaclonamenLos de herana a classes exlsLenLes. As duas
posslbllldades so (llusLradas com exemplos):
Introdues
Modlcando a hlerarqula de classes:
! lazer com que uma ou mals classes lmplemenLem uma ou
mals lnLerfaces:
(Lodas as classes que comeam com "8ecelLa" vo lmplemenLar as duas
lnLerfaces enumeradas).
! lazer com que uma ou mals classes se[am lhas de uma
classe:

(a classe lngredlenLe Lorna-se lha da classe Comlda).
declare parents : Receita* implements Cacheable, Cloneable;
declare parents : Ingrediente extends Comida;
Introdues
Modlcando a hlerarqula de classes:
! A nova hlerarqula de classes s e uul no conLexLo dos
aspecLos, ou se[a, como o resLanLe do programa no sabe
que as classes Lm a hlerarqula denlda no aspecLo, no
podem fazer uso dela. no enLanLo, o aspecLo pode.
! Alem dlsso, o aspecLo no pode vlolar as regras de herana
da llnguagem !ava, ou se[a, uma classe no pode herdar de
mals de uma classe. orLanLo, a declarao de &:,&+"5
aclma no pode ser usadas com classes que [ herdam de
alguma ouLra classe.
Introdues
lnLroduzlndo erros de compllao e warnlngs:
! C aspecLo pode forar o compllador a apresenLar erros
caso algum ponLo de [uno se[a enconLrado.
! lsso e uul, por exemplo, para verlcar pollucas
esLabelecldas de uso de programas Lercelros.
! Suponha que o arqulLeLo do slsLema Lenha decldldo que
no se deve usar o upo de dados (00!;<$5,, por quesLes
de desempenho. Lle pode valldar o slsLema com a segulnLe
declarao em um aspecLo:
declare error: call(java.lang.ArrayList.new(..)) :
"No permitido usar ArrayLists";
Introdues
lnLroduzlndo erros de compllao e warnlngs:
! L posslvel Lambem, ao lnves de declare error, usar
declare warnlng para gerar um warnlng ou lnves de um
erro no compllador.
Exerccio
! lmplemenLe exemplos de advlces para os segulnLes casos:
! 1esLar o: after() returning :
ponto_de_corte()
! 1esLar o meLodo proceed() denLro de um advlce do upo
around(). Cbs. no usar o exemplo do LoSLrlng().
! 1esLar um advlce com passagem de conLexLo. 8ecuperar o
ob[eLo aLraves do LargeL e o argumenLo aLraves do args e
lmprlmlr o nome do ob[eLo e o argumenLo passado.
! 1esLar a lnLroduo de um aLrlbuLo e de um meLodo em
uma classe.
! 1esLar a declarao de warnlngs caso alguma regra
especlcada prevlamenLe Lenha sldo vlolada.

You might also like