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();
}

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам