Как сопоставить метод с аннотированным аргументом в AspectJ

Я хотел бы сопоставить такой метод:

@Foo
public void boo(@Baz Bar bar) { ... }

В принципе:

  • метод имеет аннотацию @Foo (которую я сопоставляю с execution(@Foo * *(..)) && @annotation(foo)),
  • может иметь переменное количество параметров,
  • и один из них должен иметь аннотацию @Baz,
  • Мне нужно продолжить работу с этим аннотированным аргументом (bar).

Если у метода есть аннотация @Foo, но отсутствует аннотация @Baz, я хочу получить ошибку как можно раньше, если это возможно, при плетении, а не во время выполнения.

Как я могу это сделать?


person soc    schedule 26.08.2011    source источник


Ответы (1)


public pointcut annArg(): execution(@Foo * *(.., @Baz (*),..));

declare error :execution(@Foo * *(..))&&!annArg() :"error";

К сожалению, невозможно получить соответствующий аргумент с помощью args(..,arg,..). Но вы можете использовать thisJoinPoint.getArgs() и API отражения, чтобы получить аннотированный аргумент. Или, если вы знаете позицию аргумента, вы можете использовать что-то вроде args(..,arg);

person alehro    schedule 26.08.2011