未调用基于 AspectJ 注释的切入点

AspectJ annotated based pointcuts not being invoked

我正在尝试创建一个 android 库,用于在执行具有我定义的自定义注释的方法之前检查互联网是否可用。我正在使用 AspectJ 来实现这一点。

我的注释如下:

@Target({METHOD}) @Retention(RUNTIME)
public @interface InternetRequired  {

}

现在我的方面:

@Aspect
public class CilantroAspect
{

    private static final String POINTCUT_METHOD = "execution(@com.cilantro.service.InternetRequired * *(..))";
    private static final String POINTCUT_METHOD2 ="@annotation(com.cilantro.service.InternetRequired)";
    ;

    @Pointcut(POINTCUT_METHOD2)
    public void internetAnnotatedMethod() {
    }

    @Around("internetAnnotatedMethod()")
    public void checkInternetConnectivity(ProceedingJoinPoint joinPoint) throws Throwable {
        Log.v("Aspect","advice being triggered");
        if (Cilantro.isConnected()) {
            joinPoint.proceed();
        } else {
            Cilantro.Toast("Internet not available");
        }
    }
}

我的 activity 代码片段,带有注释方法。

    ....
    Cilantro.init(this);
    test();
}

@InternetRequired
public void test()
{
    Toast.makeText(this,"Test method",Toast.LENGTH_LONG).show();
}

当我 运行 我的 android 应用程序时,周围的建议没有被触发。我尝试使用 POINTCUT_METHOD 和 POINTCUT_METHOD2。仍然没有运气。

我的 android 应用程序配置为使用 Aspect J,所以我知道这不是问题所在,因为如果我在切入点定义中出错,它会被检测到......但为了确保让我分享。

主要构建脚本

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
        classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+'
}
....

包含方面的模块

apply plugin: 'com.android.library'
apply plugin: 'android-aspectj' 
....

没有触发周围建议,因为我在应用程序级别使用与方面相关的注释,而方面包含在库中。为了在编译时将这些方面编织到应用程序模块中,我必须简单地将库发布到 maven(用于测试的本地和用于分发的 maven 中心),然后将库作为项目依赖项包含在 gradle 插件中包含 AspectJ 编织 tasks.The 插件,然后应用于应用程序的模块。

这是我用 groovy 编写的插件片段。我添加了包含我的方面的库,然后 运行 应用程序模块上的编织任务。

project.dependencies {
    compile 'com.github.jd-alexander:flender-runtime:1.0'
    // TODO this should come transitively
    compile 'org.aspectj:aspectjrt:1.8.5'
}

variants.all { variant ->

    variant.dex.doFirst {
        String[] args = [
                "-showWeaveInfo",
                "-1.5",
                "-inpath", javaCompile.destinationDir.toString(),
                "-aspectpath", javaCompile.classpath.asPath,
                "-d", javaCompile.destinationDir.toString(),
                "-classpath", javaCompile.classpath.asPath,
                "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)
        ]
        log.debug "ajc args: " + Arrays.toString(args)

        MessageHandler handler = new MessageHandler(true);
        new Main().run(args, handler);

有关如何完成此操作的完整示例,您可以在 github https://github.com/jd-alexander/flender

上查看我的图书馆