我有方法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();
}
答案 0 :(得分:1)
我刚刚找到了一种方法,可以使用AspectJ语言的两个特殊关键字来实现这一目标:thisEnclosingJoinPointStaticPart
和thisJoinPointStaticPart
。这样,您需要将封闭的连接点保持在调用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();
}
}
我希望这有助于你所需要的。