AspectJ указывает на переменную метода, возможно ли это?

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

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

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

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

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

person smuggledPancakes    schedule 20.12.2010    source источник


Ответы (2)


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

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

person Sean Patrick Floyd    schedule 20.12.2010

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

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

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

person Eugene Kuleshov    schedule 20.12.2010
comment
Мне кажется забавным, что я использую pointcut для создания экземпляра переменной метода, но я чувствую, что это все еще не относится к сквозной проблеме. Существует около 10 строк шаблонного кода, который будет дублироваться в нескольких классах без аспекта. Разве это просто невозможно в AspectJ? - person smuggledPancakes; 20.12.2010