AspectJ: обвързване на параметър с 'args()' за методи с множество параметри

Имам известен проблем със създаването на before аспект за метод, който има множество параметри.

public class Sample {
    public boolean myCall(String s, String s1, String s3, ByteBuffer bytes, int i, int g) {
        System.out.println("Calling real sample");
    }
}

Този аспект не съвпада. Трябва само да използвам параметъра ByteBuffer в кода за заместване.

pointcut sampleCall(ByteBuffer bytes) :
    execution(boolean com.example.Sample.myCall (..)) && args(bytes);

before(ByteBuffer bytes) : sampleCall(bytes) {
    System.out.println("Before sample");
}

person UmYeah    schedule 28.03.2011    source източник


Отговори (1)


Всъщност най-накрая успях да работя с него

pointcut sampleCall(ByteBuffer bytes) :
    execution(boolean com.example.Sample.myCall(String, String, String, ByteBuffer, ..))
    && args(String, String, String, bytes, ..);

before(ByteBuffer bytes) : sampleCall(bytes) {
    System.out.println("Before sample");
}
person UmYeah    schedule 29.03.2011
comment
Ако искате да разберете по-добре защо трябва да знаете позицията на параметъра от лявата или дясната страна на списъка с параметри: защото args(.., ByteBuffer, ..) би било двусмислено. Само си представете, че има два ByteBuffer параметъра. Кое трябва да избере AspectJ? Отговорих на подобен въпрос тук. Ако наистина имате методи със списъци с параметри, толкова различни, че не можете да ги съпоставите с един pointcut, или имате нужда от повече pointcut-и, или трябва да ги хванете всички и след това да повторите JoinPoint.getArgs() по време на изпълнение (бавно). - person kriegaex; 29.03.2017