gpt4 book ai didi

AspectJ:如何选择给定类的子类的非注释方法的执行?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:31 30 4
gpt4 key购买 nike

我想拦截给定类的任何子类的非注释方法的执行。

例如,假设我有类 Base:

public class Base {
public void baseMethod() { //shouldn't be intercepted
// do whatever...
}
}

并且,最终,有人扩展了 Base。无论新类名是什么,它带有一些注解的方法 @LeaveItAlone 都不应该被拦截。子类的所有其他方法都应该。

public class Sub extends Base {
public void interceptedMethod1() {
// ...
}

public void interceptedMethod2() {
// ...
}

@LeaveItAlone
public void NOTinterceptedMethod1() {
// ...
}

@LeaveItAlone
public void NOTinterceptedMethod2() {
// ...
}

我想是这样的:

pointcut sub_nonannotated() : !execution(@LeaveItAlone * Base+.*(..));

但我确定以上是错误的。

附带问题:我如何专门拦截子类的构造函数?

最佳答案

事实上,我刚刚试过了,你显然已经几乎正确了。这对我有用:

package com.snaphop.ats.util;

public aspect Blah {
pointcut sub_nonannotated() : !execution(@LeaveItAlone * Base+.*(..));

pointcut sub() : execution(* Base+.*(..));

pointcut notBase() : ! execution(* Base.*(..));

pointcut cons() : execution(public Base+.new(..)) && ! execution(public Base.new(..));


//advice sub class methods but not annotation or parent
Object around() : sub_nonannotated() && sub() && notBase() {
return proceed();
}

//Advice subclass constructors but not Base's constructor
Object around() : cons() {
return proceed();
}
}

关于AspectJ:如何选择给定类的子类的非注释方法的执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15952839/

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