重载方法的切入点

时间:2018-05-29 18:37:47

标签: java aop aspectj aspect pointcut

如果我们使用嵌套调用重载方法,如下所示

public void sample(int a) {
    sample(a, 5);
}

public void sample(int a, int offset) {
    System.out.println(a + offset);
}

有一个切入点和建议如下

@Pointcut("execution(public * sample*(..))")
public void sampleMethod() {}


@Around("sampleMethod()")
public Object storeMetrics(final ProceedingJoinPoint jp) throws Throwable {
        System.out.println("Advice called");
    }

现在,如果调用sample(10),我会将“Advice called”作为输出两次。这是否意味着poincut拦截了重载的方法?

但请考虑以下方法未超载的情况。现在它只打印一次“Advice called”,即使这两个方法都与切入点表达式匹配

public void sample(int a) {
    sampleWithOffset(a, 5);
}

public void sampleWithOffset(int a, int offset) {
    System.out.println(a + offset);
}

@Pointcut("execution(public * sample*(..))")
public void sampleMethod() {}


@Around("sampleMethod()")
public Object storeMetrics(final ProceedingJoinPoint jp) throws Throwable {
        System.out.println("Advice called");
    } 

1 个答案:

答案 0 :(得分:1)

首先,您的@Around方面无法编译,因为它不会返回结果。您可能忘记从代码中复制return jp.proceed();之类的内容。

  

现在,如果调用sample(10),我会将“Advice called”作为输出两次。这是否意味着poincut截获重载的方法?

当然,因为你的切入点与两个方法名都匹配。如果您想要不同的行为,请更改您的切入点。

  

但请考虑以下方法未超载的情况。现在它只打印一次“Advice called”,即使这两个方法都与切入点表达式匹配

你的陈述是错误的。该方面还打印两次。这是证据:

驱动程序应用程序:

package de.scrum_master.app;

public class Application {
  public void sample(int a) {
    sample(a, 5);
    sampleWithOffset(a, 9);
  }

  public void sample(int a, int offset) {
    System.out.println(a + offset);
  }

  public void sampleWithOffset(int a, int offset) {
    System.out.println(a + offset);
  }

  public static void main(String[] args) {
    new Application().sample(11);
  }
}

<强>方面:

package de.scrum_master.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MyAspect {
  @Pointcut("execution(public * sample*(..))")
  public void sampleMethod() {}

  @Around("sampleMethod()")
  public Object storeMetrics(final ProceedingJoinPoint jp) throws Throwable {
    System.out.println(jp);
    return jp.proceed();
  }
}

控制台日志:

execution(void de.scrum_master.app.Application.sample(int))
execution(void de.scrum_master.app.Application.sample(int, int))
16
execution(void de.scrum_master.app.Application.sampleWithOffset(int, int))
20