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

StackOverflow https://stackoverflow.com/questions/4491486

Вопрос

Я уже некоторое время использую AspectJ, и он отлично работает с полями области видимости объекта, содержащими аннотации.Я только что столкнулся с ситуацией, когда я хочу аннотировать переменную области видимости метода, которая будет работать с моим 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();
}
Это было полезно?

Решение

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top