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