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



我正在尝试创建一个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");
        }
    }
}

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

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

around建议没有被触发,因为当方面包含在库中时,我正在从应用程序级别使用与该方面相关的注释。为了在编译时将方面编织到应用程序模块中,我只需将库发布到maven(本地用于测试,maven中心用于分发(,然后将库作为项目依赖项包含在包含AspectJ编织任务的gradle插件中。然后将插件应用于应用程序的模块。

下面是我用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

相关内容

  • 没有找到相关文章

最新更新