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