Можно ли создать точечный вырез AspectJ вокруг переменной уровня класса?

То, что я ищу, - это способ указать pointcut вокруг переменной уровня класса. Что-то вроде:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.FIELD)
@interface MyPointCut
{
}

public class Foo
{

    @MyPointCut
    BarAPI api = new BarAPI();

}

@Aspect
public class MyAspect
{
    @Around(value="execution(* *(..)) && @annotation(MyPointCut)")
    public Object doSomethingBeforeAndAfterEachMethodCall()
    {
        ...
    }
}

Затем я хотел бы иметь аспект, который выполняет некоторую работу до и после каждого вызова метода поля api. Это выполнимо? Не могли бы вы указать мне какую-нибудь документацию, где я могу прочитать, как это сделать?


person mdzh    schedule 21.07.2016    source источник
comment
Я не знаю, как насчет поля, но вы можете добавить геттер и добавить вокруг него аспект   -  person Mykola Yashchenko    schedule 21.07.2016
comment
У меня это не работает. Я хотел бы достичь способа выполнения кода при каждом вызове методов этого поля. Я просто не знаю, поддерживает ли аспектJ такую ​​вещь   -  person mdzh    schedule 21.07.2016


Ответы (1)


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

// Execution of any BarAPI method running in the control flow of a Foo method
Object around(): execution(* BarAPI.*(..)) && cflow(within(Foo)) {...}

cflow для этого немного `` тяжелый '', можем ли мы сделать что-нибудь более легкое:

// Call to any BarAPI method from the type Foo
Object around(): call(* BarAPI.*(..)) && within(Foo) { ... }

А как насчет чего-то такого, но более общего:

// Assume Foo has an annotation on it so it is more general than type Foo.
@HasInterestingBarAPIField
public class Foo { ... }

Object around(): call(* BarAPI.*(..)) && @within(HasInterestingBarAPIField) { ... }
person Andy Clement    schedule 22.07.2016