Estou tentando usar um ponto de corte de
@Around("staticinitialization(*)")
mas ao aplicar recebo este erro:
[iajc] [erro 4]: erro em /home/dave/dev/coyote/projects/aspects/debug_src/com/acme/aspects/exceptions/StaticInitializerExceptions.java:15::443 na inicialização estática da interface 'com.acme.intgservices.discussions.DiscussionListener' não suportado (limitação do compilador)
O que, claro, faz sentido. Mas há uma maneira de dizer ao aspectj para não selecionar interfaces? Isso parece algo que ele deveria fazer sozinho?
Você precisa usar os chamados padrões de tipo de categoria de tipo . Infelizmente, eles não são documentados nos documentos regulares do AspectJ , como o Programming Guide, o AspectJ 5 Developer's Notebook ou os PDFs de referência rápida. Mas eles são descritos nas notas de versão 1.6.9 e uma extensão por mais uma categoria é mencionada nas notas de versão 1.8.4 .
No seu aspecto, você precisa excluir ambos os tipos de interface by
!is(InterfaceType))
e o próprio aspecto by!within(MyAspect)
para evitar que o aspecto tente se entrelaçar em seu próprio inicializador estático, o que levaria a um erro de tempo de execução durante a inicialização do aspecto.Registro do console: