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