【问题标题】:Cancel a method execution with around advice and execute this method manually inside the aspect使用环绕通知取消方法执行并在方面内手动执行此方法
【发布时间】:2014-04-15 20:20:40
【问题描述】:

是否可以使用环绕通知取消方法的执行并在方面的方法内执行它?

示例: 我们有一个项目:

1 - 一个活动 SenderActivity.java。在这个活动中,我们有一个返回字符串的方法 MethodA()

喜欢:

public static String MethodA(){
String string = "a string";
return string;
}

2 - 我们使用 aspect.aj 中的切入点捕获 MethodA() 的执行

喜欢:

pointcut pointcut_catchMethodA() : execution(static String MethodA());

周围的建议是:

String around() : pointcut_catchMethodA(){
//We return null or simply don't call the proceed()
return null;
}

所以在这里,每次尝试执行 MethodA() 时,周围的通知都会取消它。

我想知道在取消之后,我是否可以做类似的事情:

public void MethodToCallMethodAInsideTheAspect(){

SenderActivity.MethodA();

}

因此,通过这种方式,我取消了对 MethodA() 的原始调用,并在我的 aspect.aj 中手动调用它。所以我希望 MethodA() 返回它的原始值。 (string = "一个字符串")。

有可能吗?或者,如果有办法实现这一点,请不要犹豫您的指导。

因为我尝试了这种实现,当我想手动执行 SenderActivity.MethodA() 时,我的实现返回了 null 值。我认为它会围绕建议的价值返回。

【问题讨论】:

  • 我不知道方面编程可以在 Android 上运行。有什么教程可以开始吗?
  • 一开始我也对此表示怀疑,但经过一番搜索,我发现它也可以在 Android 上使用。这是一个很好的教程:deansserver.co.uk/~dean/2011/07/18/…

标签: java android aop aspectj


【解决方案1】:

我自己找到了解决方案:

这个架构确实有效,它只需要替换切入点:

来自

pointcut pointcut_catchMethodA() : execution(static String MethodA());

到:

pointcut pointcut_catchMethodA() : call(static String MethodA(..)) && !within(Aspect);

在这里,我们使用 within 是因为我们不希望我们的切面捕获从切面发出的调用,即

public void MethodToCallMethodAInsideTheAspect(){

SenderActivity.MethodA();

}

所以这个调用不会被周围的建议捕获。所以对 MethodA() 的原始调用已被环绕通知取消,并由 MethodToCallMethodAInsideTheAspect() 手动调用

【讨论】:

    猜你喜欢
    • 2018-05-07
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2014-04-20
    • 2012-11-09
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多