Java AspectJ:与';args()';对于具有多个参数的方法

Java AspectJ:与';args()';对于具有多个参数的方法,java,aop,aspectj,Java,Aop,Aspectj,我在为具有多个参数的方法创建之前的方面时遇到一些问题 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 sampleCa

我在为具有多个参数的方法创建
之前的
方面时遇到一些问题

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");
}

事实上,我终于找到了工作

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");
}

如果您想更好地理解为什么需要从参数列表的左侧或右侧了解参数位置:因为
args(..,ByteBuffer,…)
将是不明确的。想象一下有两个
ByteBuffer
参数。AspectJ应该选择哪个?我回答了一个类似的问题。如果确实有一些方法的参数列表非常不同,以至于无法用单个切入点来匹配它们,那么要么需要更多切入点,要么必须捕获所有切入点,然后在运行时迭代
JoinPoint.getArgs()
(慢速)。