调用方法的切入点,调用里面的特定方法

时间:2014-12-04 11:01:09

标签: aspectj

我有方法A和方法B.我想将切入点附加到方法A,只有在方法A中调用方法B. 是否有可能与Aspets?谢谢。 例: Aspect代码:

package aspects.unregistrator;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;

import com.core.Item;

public aspect Unregistrator {

pointcut unRegistrated() : within(tasks..*) && call(* find(..));

    after() : unRegistrated()  {
        Item.unregisterAll();
    }
}

这将在每次调用任务包

中的find()之后附加点

但我需要在包含find()调用的每个方法之后执行unregisterAll(),如下所示:

package tasks.helpers;

public class TableHelper {

public static void clickButtonInCell(final WTable table) {
    table.find(SubitemFactory(Element.BUTTON)).click();
    Item.unregisterAll();
}

1 个答案:

答案 0 :(得分:1)

我刚刚找到了一种方法,可以使用AspectJ语言的两个特殊关键字来实现这一目标:thisEnclosingJoinPointStaticPartthisJoinPointStaticPart。这样,您需要将封闭的连接点保持在调用find()方法的位置(在您的情况下为public static void clickButtonInCell(final WTable table))。然后,您需要检查每个方法执行是否find()方法的封闭连接点是否与其连接点相同。

例如:

class TableHelper {

    public static void clickButtonInCell(final WTable table) {
        System.out.println("clickButtonInCell");
        table.find();  
        // Item.unregisterAll() will be called after find() 
    }

    public static void clickButtonInX(final WTable table) {
        System.out.println("clickButtonInX");
        table.doSomething(); 
        // even if Item.unregisterAll() is matched with this method execution, it will not work
    } 

}


public aspect Unregistrator {

    String enclosedJP = "";

    pointcut unRegistrated() : within(tasks..*) && call(* find(..));

    after() : unRegistrated()  {
        enclosedJP = thisEnclosingJoinPointStaticPart.toLongString();
    }

    pointcut doPointcut(): within(tasks..*) &&  execution(* *(..));

    after() : doPointcut(){
        if(enclosedJP.equals(thisJoinPointStaticPart.toLongString()))
            Item.unregisterAll();
    }
}

我希望这有助于你所需要的。