【问题标题】:aspectj with android, aspect never called带有android的aspectj,从未调用过aspect
【发布时间】:2015-07-27 08:57:05
【问题描述】:

在我正在工作的项目中,我们最近添加了一定程度的安全性,现在我不想重写整个网络逻辑,如果它可以使用 AOP 更轻松地完成的话。

所以,我试图拦截整个应用程序中使用的 requestListener 的“onRequestSuccess”方法。 为此我做了一个简单的方面:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;


@Aspect
public class NetworkResponseAspect {

@Around("execution(public void *.onRequestSuccess(..))")
public void intercept(ProceedingJoinPoint joinPoint){
    System.out.println("call intercepted " + joinPoint);


    try {
        joinPoint.proceed();
    } catch (Throwable e) {
        System.out.println("wut");
    }

}

}

我添加了 aspectj weaver 依赖项:compile 'org.aspectj:aspectjweaver:1.8.6'

而且好像还可以,至少注释被android studio识别了。

我在“joinpoint.proceed()”调用上放置了一个断点,并在调试模式下启动了应用程序。 但是当我登录(触发一个这样的监听器的动作)时,什么也没有发生。我错过了什么吗?

【问题讨论】:

  • 就我而言,@Before@After 也收到了回调,但 @Around

标签: android android-studio aspectj


【解决方案1】:

在 Maven 中,您将使用 AspectJ Maven 插件(当前版本为 1.7),在 Gradle 中类似。如果要使用 CTW(编译时编织),这就是编译所需要的。这些插件应该已经包含对 aspectjtools.jar 的依赖,其中包含 AspectJ 编译器和其他内容。如果使用 CTW,则需要 aspectjrt.jar(AspectJ 运行时)作为默认范围(编译)或依赖项,因为在运行时也需要它。

如果您想使用加载时编织 (LTW),您需要通过 -javaagent:... 在 JVM 命令行上使用 aspectjweaver.jar,因为编织代理需要挂钩到类加载在加载第一个应用程序类之前。 P.S.:编织代理还包含 AspectJ 运行时类,因此在这种情况下您不需要对运行时的额外依赖。

【讨论】:

  • 我确实在为我的项目使用 gradle,但除了单独的库之外,我似乎找不到真正的插件。我确实相信 CTW 是去这里的方式,所以我尝试使用运行时工具而不是 weaver lib,但不幸的是它没有任何区别。我发现的唯一有希望的是这个项目:github.com/eveoh/gradle-aspectj 我想我会尝试一下
  • 是的,这个插件名称敲响了警钟。 (我是 Maven 人,不是 Gradle 人,但我想我曾经使用过该插件来回答另一个问题。不过,我必须回家才能访问我的家用电脑,但我仍在路上。)如果你想使用 CTW,你肯定需要使用使用 AspectJ 编译器的插件来编译方面。对于 CTW,Javac 是不够的。而且你肯定需要对 aspectjrt.jar. 的依赖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多