首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >重载方法的切入点

重载方法的切入点
EN

Stack Overflow用户
提问于 2018-05-30 02:37:47
回答 1查看 586关注 0票数 0

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

代码语言:javascript
复制
public void sample(int a) {
    sample(a, 5);
}

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

下面是一个切入点和建议

代码语言:javascript
复制
@Pointcut("execution(public * sample*(..))")
public void sampleMethod() {}


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

现在,如果调用sample(10),我得到的“建议调用”是输出的两倍。这是否意味着切入点截获了两个重载的方法?

但是考虑一下方法没有重载的情况,如下所示。现在,即使两个方法都与切入点表达式匹配,它也只输出一次“通知调用”

代码语言:javascript
复制
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");
    } 
EN

回答 1

Stack Overflow用户

发布于 2018-05-31 09:02:58

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

现在,如果调用

(10),我得到的“建议调用”是输出的两倍。这是否意味着切入点截获了两个重载的方法?

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

,但请考虑方法没有重载的情况,如下所示。现在,即使两个方法都与切入点表达式匹配,它也只输出一次“通知调用”

你的陈述是错误的。方面也打印两次。以下是证据:

驱动程序:

代码语言:javascript
复制
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);
  }
}

方面:

代码语言:javascript
复制
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();
  }
}

控制台日志:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50590884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档