Вопрос: AspectJ pointcut на переменной метода, возможно ли это?


Я использую AspectJ некоторое время, и он отлично работает на областях области объектов, содержащих аннотации. Я просто столкнулся с ситуацией, когда хочу аннотировать переменную области метода, которая будет работать с моим pointcut, но у меня возникают проблемы с этим.

Вот пункт, который я использую. Он отлично работает, если моя переменная является полем для объекта, но если я уменьшу область действия до метода (переменной, объявленной внутри метода), то она больше не работает, и я не знаю, почему. Позвольте мне знать, что я могу сделать, спасибо.

 after(final Trigger trigger): set(@Triggereable * *) && args(trigger)
 {
  System.out.println("trigger flush");
 }

Кроме того, здесь приведен пример того, что я хочу работать. Это System.out.println выше должно срабатывать при создании экземпляра Trigger:

public void foo()
{
   @Triggereable
   private Trigger trigger = new Trigger();
}

4


источник


Ответы:


AspectJ в настоящее время не поддерживает pointcut для локальных переменных (см. Часто задаваемые вопросы ).

Кажется, я вспоминаю недавнюю дискуссию о такой возможности, которая может быть добавлена ​​в ближайшее время, но я не мог найти ее в AspectJ вопрос трекер  ни в Архивы списков рассылки


1



Если вы пришли к такой ситуации, вы, вероятно, пытаетесь изменить реализацию, вместо того, чтобы применять фактические проблемы перекрестной резки. В принципе, это не то, для чего должны использоваться AOP и AspectJ.

Как работа, вы можете либо извлечь соответствующие функции в отдельный метод, а затем применить свои аспекты к этому методу или, альтернативно, вы можете заменить весь метод на эту локальную переменную, используя советы.

Более того, в вашем конкретном примере pointcut может применяться к выполнению конструктора в рамках данного метода, поэтому вы можете делать практически то же самое без привязки к локальной переменной.


5