3

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

例如,假设我有课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+.*(..));

但我确定以上是错误的。

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

4

2 回答 2

4

实际上,我只是尝试过,您显然几乎正确。这对我有用:

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();
    }
}
于 2013-04-11T16:38:03.843 回答
0

Adam Gent 的解决方案太复杂了。这个切入点更简单明了:

execution(!@LeaveItAlone * Base+.*(..))

或者,也许您更喜欢它(口味问题):

execution(* Base+.*(..)) && !@annotation(LeaveItAlone)

PS:这只涉及方法,而不是构造函数,这是您在第一句话中要求的。我还包括Base其自身的方法,而不仅仅是子类,这可能是有道理的。如果您想要更复杂的东西,您仍然可以将我的解决方案与亚当的元素结合起来。

于 2015-12-03T22:56:03.647 回答