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

时间:2015-07-01 14:57:45

标签: java android aspectj aop

我正在尝试创建一个安卓库,在执行具有我定义的自定义注释的方法之前检查互联网是否可用。我使用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");
        }
    }
}

带有带注释方法的活动片段。

    ....
    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.+'
}
....

包含Aspects的模块

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

1 个答案:

答案 0 :(得分:1)

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

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

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