0

我想捕获所有方法执行。所以我在下面定义了切入点并试图用get/set切入点指示符排除字段访问,但它不起作用。

有什么建议么?非常感谢。

 pointcut funcExecutionPointcut():execution(* *.*(..)) && !get(* *.*) && !set(* *.*);

   before():funcExecutionPointcut()     {

             //log some info.   
             Signature sig = thisJoinPointStaticPart.getSignature();
              String className = "";
        if (thisJoinPoint.getThis() != null)
            className = thisJoinPoint.getThis().getClass().getName();
            mylogger.log(Level.INFO,"Entering [(" + className + ")" + sig.toShortString() + "] @" + line + "@" +file);
 }

问题是输出显示类的字段也被切入点命中,如下所示。

2013-09-30 11:39:11:18  Thread-447      INFO AspectJFuncTracing - Entering [()ImageListManager.access$0(..)] @48@ImageListManager.java
2013-09-30 11:39:11:19  Thread-447      INFO AspectJFuncTracing - Entering [()ImageListManager.access$1(..)] @56@ImageListManager.java

对应的源代码如下。

    ....
    public void run() {

        while (mThreadBeing) {
            try {
                sleep(sleeptime);
            } catch (Exception e) {
                e.printStackTrace();
            }
            sleeptime = 200;
            if (!mThreadBeing) {
                break;
            }
            if (mScrolling) {
                continue;
            }
                            ...

ImageListManager.access$0 指向类字段 mThreadBeing,而 ImageListManager.access$1 指向类字段 mScrolling。

4

1 回答 1

1

这些是合成方法的执行,它们是由编译器创建的,因为我想根据您写下的内容,run()方法位于ImageListManager的内部类中。他们负责检索第一个和第二个定义字段的值(假设从访问后的 $0 和 $1 开始)。

如果要删除切入点和和子句中的执行,请使用:

!execution(* *.access$*(..))

希望能帮助到你,

达里奥。

于 2013-12-06T12:37:41.277 回答