gpt4 book ai didi

java - 继承方法的切入点(在与类设计无关的上下文中)

转载 作者:搜寻专家 更新时间:2023-10-30 21:12:53 24 4
gpt4 key购买 nike

我在摆弄 AspectJ 并想出了一个我似乎无法正确实现的想法(我的生活故事)。

我已经定义了一个方面:

package my.package;

import org.aspectj.lang.annotation.*;
import org.aspectj.lang.ProceedingJoinPoint;

@Aspect
public class MyAspect {

@Pointcut("execution(* *(..)) && this(o)")
public void instanceMethod(Object o) {}

@Pointcut("within(@Marker *)")
public void methodsFromMarkedClasses() {}

@Around("methodsFromMarkedClasses() && instanceMethod(o)")
public Object markedMethodsAdvice(ProceedingJoinPoint joinPoint, Object o) throws Throwable {
// do awesome stuff
return null; //<- not the actual return, just added this so that my head wouldn't hurt
}
}

我已经定义了空的 @Marker 注释。

这个想法是让通知 markedMethodsAdvice 在任何时候在用 @Marker 标记的类的对象上调用方法时执行。甚至(这是棘手的部分):


案例一

如果所述方法继承自未标记的类,请参见示例:

给定

package my.package;
public class Alpha {
public void methodA() {}
}

何时

package my.package;
@Marked
public class Beta extends Alpha {}

然后

/* Should trigger the advice */
new Beta().methodA();

案例二

如果在子类的对象上调用所述方法 (Liskov)

给定

@Marked
public class Beta extends Alpha { //still extends A just to be coherent with previous example
public void methodB() {}
}

何时

package my.package;
public class Gamma extends Beta {
}

然后

/* Should trigger the advice */
new Gamma().methodB();

(因为我很贪心,所以我问了这个红利)

案例三

如果所述方法在子类上声明

给定

@Marked
public class Beta extends Alpha {} //still extends A just to be coherent with previous example

何时

package my.package;
public class Gamma extends Beta {
public void methodC() {}
}

然后

/* Should trigger the advice */
new Gamma().methodC();

aspectj documentation似乎说这是可能的

execution(public void Middle.*())

picks out all method executions for public methods returning void and having no arguments that are either declared in, or inherited by, Middle, even if those methods are overridden in a subclass of Middle

那我做错了什么?

最佳答案

您可以尝试使用 @Inherited 对 @Marker 注释进行注释注解。子类应该继承@Marker 注解。

java.lang.annotation.Inherited

@Inherited
public @interface Marked{

}

关于java - 继承方法的切入点(在与类设计无关的上下文中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30648881/

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