gpt4 book ai didi

java - 重载方法的切入点

转载 作者:行者123 更新时间:2023-12-02 11:11:29 24 4
gpt4 key购买 nike

如果我们有如下嵌套调用的重载方法

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”输出。这是否意味着切入点拦截了两个重载的方法?

但请考虑以下方法未重载的情况。现在,即使两个方法都匹配切入点表达式,它也仅打印一次“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");
}

最佳答案

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

Now, if sample(10) is called, I get "Advice called" twice as the output. Does this mean poincut intercepts both the overloaded the methods?

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

But consider the case where the method is not overloaded as below. Now it prints "Advice called" only once even both the methods match the pointcut expression

你的说法是错误的。该方面也打印两次。证据如下:

驱动程序应用程序:

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

关于java - 重载方法的切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50590884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com