java - 具有 super 方法调用的继承方法的切入点

标签 java spring-boot aop aspectj pointcut

我有以下类(class)

class A {
    public void someone() {
        helpMe();
    }
    private void helpMe() {
        // do something here
    }
}
class B extends A {
    public void help() {
        super.someone();
    }
}
class C extends A {
    public void me() {
        super.someone();
    }
}

所以我想在每次调用 helpMe 方法时执行一些操作。 A.helpMe() 永远不会显式调用。 A.helpMe() 的所有方法调用都是通过 A.someone() 进行的,并通过 B.help() 进一步调用或C.me()

helpMe 包含所有其他类都需要的通用实现。

我尝试过的切入点

execution(* A.helpMe(..)) // does not work
execution(* A+.helpMe(..)) // does not work
execution(* *.helpMe(..)) // does not work

execution(* A.*(..)) // does not work
execution(* B.someone(..)) // does not work
execution(* A+.*(..)) // forms a point cut for B.help() and C.me() only
execution(* *.*(..)) // forms a point cut for B.help() and C.me() only
execution(* B.*(..)) // forms a point cut for B.help() only

我在某处读到,不允许对 super 进行切入点。如果是这样,有哪些有效的解决方法?

我尝试使用注释获取切入点,但它也不起作用。

最佳答案

1 如果有疑问,请始终退回到完全硬编码的切入点并再次继续:

execution(private void helpMe())

你确定是using AspectJ而不是普通的 Spring AOP(它不能建议私有(private)方法)?


仅供引用:https://www.eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html

the call join point does not capture super calls to non-static methods

...这不适用于执行

关于java - 具有 super 方法调用的继承方法的切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58836455/

相关文章:

c++ - 有没有一种工具可以让我将一行代码插入到 C++ 源文件中的所有函数和方法中?

java - 无法通过 BufferedReader 读取文本文件

spring-boot - Spring Keycloak 适配器权限策略执行器。如何设置

java - 碰撞检测返回从图像文件名派生的值

java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean

spring-boot - 在 spring boot 中禁用 CSRF 的原因

c# - 是否可以在您不拥有且未创建的对象上拦截静态方法?

java - 带有 Spring Boot 建议的 AOP 未触发

java - 如何格式化文本字段内的数学表达式?

java - 私有(private)变量是否与私有(private)类中的包/默认/无修饰符变量具有相同的访问权限?