AOP(Aspect Oriented Programming)切面编程在处理一些与业务逻辑无关,但在很多地方又不得不添加相关逻辑代码,可以很好的解决相关问题,比如在Android中有些地方需要打LOG日志,或者在某些地方需要检查系统权限等,可以很好的解决这类问题。

而AOP中主要使用的就是AspectJ,AspectJ有自己相关的一套语法,大致和JAVA类似。官方简介

那么在AndroidStudio 中要怎么使用AOP呢?

首先需要新建一个module,方便引入相关的AspectJ配置,便于在其中编写与业务逻辑无关紧要,并且在代码中经常出现的常用代码, 之后在module下的build.gradle中 导入AspectJ的dependences

compile ‘org.aspectj:aspectjrt:1.8.9’
复制代码

并在build.gradle根下配置

repositories {mavenCentral()
}buildscript {repositories {mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:2.1.3'classpath 'org.aspectj:aspectjtools:1.8.9'classpath 'org.aspectj:aspectjweaver:1.8.9'}
}android.libraryVariants.all { variant ->LibraryPlugin plugin = project.plugins.getPlugin(LibraryPlugin)JavaCompile javaCompile = variant.javaCompilejavaCompile.doLast {String[] args = ["-showWeaveInfo","-1.5","-inpath", javaCompile.destinationDir.toString(),"-aspectpath", javaCompile.classpath.asPath,"-d", javaCompile.destinationDir.toString(),"-classpath", javaCompile.classpath.asPath,"-bootclasspath", plugin.project.android.bootClasspath.join(File.pathSeparator)]MessageHandler handler = new MessageHandler(true);new Main().run(args, handler)def log = project.loggerfor (IMessage message : handler.getMessages(null, true)) {switch (message.getKind()) {case IMessage.ABORT:case IMessage.ERROR:case IMessage.FAIL:log.error message.message, message.thrownbreak;case IMessage.WARNING:case IMessage.INFO:log.info message.message, message.thrownbreak;case IMessage.DEBUG:log.debug message.message, message.thrownbreak;}}}
}
复制代码

以上module的build.gradle 配置主要是搭建AspectJ运行环境

之后在app下的build.gradle添加module的依赖,并且添加如下配置

repositories {mavenCentral()
}
buildscript {repositories {mavenCentral()}dependencies {classpath 'org.aspectj:aspectjtools:1.8.9'}
}final def log = project.logger
final def variants = project.android.applicationVariants
variants.all { variant ->if (!variant.buildType.isDebuggable()) {log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")return;}JavaCompile javaCompile = variant.javaCompilejavaCompile.doLast {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);for (IMessage message : handler.getMessages(null, true)) {switch (message.getKind()) {case IMessage.ABORT:case IMessage.ERROR:case IMessage.FAIL:log.error message.message, message.thrownbreak;case IMessage.WARNING:log.warn message.message, message.thrownbreak;case IMessage.INFO:log.info message.message, message.thrownbreak;case IMessage.DEBUG:log.debug message.message, message.thrownbreak;}}}
}
复制代码

以上配置主要是将app和module关联起来。

然后在module中创建TestAspectJ类, 具体代码如下:

package com.clayx.org.aspectj;import android.annotation.TargetApi;
import android.os.Build;
import android.util.Log;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;/*** Created by Administrator on 2016/9/2.*/
@Aspect
public class TestAspectJ {private static final String METHOD_EXECUTION = "execution(* *..MainActivity+.onCreate(..))";private static final String METHOD_CALL = "call(* *..MainActivity+.test(..)) && args(name)";private String TAG = "Clayx";@Pointcut(METHOD_EXECUTION)public void methodExecution() {}@Pointcut(METHOD_CALL)public void methodCall(String name) {}@Around("methodExecution()")public void aroundMethodExecution(ProceedingJoinPoint joinPoint) throws Throwable {joinPoint.proceed();String result = "-----------------------------MethodExecution";Log.e(TAG, result);}@Around("methodCall(String)")public Object arouneMethodCall(ProceedingJoinPoint joinPoint){String name = (String) joinPoint.getArgs()[0];Log.e(TAG,name);return name;}}
复制代码

运行APP,打印出Log如下:

对于注解的使用,可以更好的和AspectJ结合使用,

注解类如下:

package com.clayx.org.aspectj.anno;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** Created by Administrator on 2016/9/2.*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAspectJ {}
复制代码

注解相关的AspectJ的实现类

package com.clayx.org.aspectj.anno;import android.content.Context;
import android.widget.Toast;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;/*** Created by Administrator on 2016/9/2.*/@Aspect
public class TestAspect {@Pointcut("execution(@TestAspectJ private * *..*.*(..))")public void testAspect() {}@Around("testAspect()")public void testTestAspect(ProceedingJoinPoint joinPoint) {Toast.makeText((Context) joinPoint.getTarget(), "OK", Toast.LENGTH_SHORT).show();}}
复制代码

注解运行如下:

转载于:https://juejin.im/post/5a6181476fb9a01c9064f18c

AspectJ在Android中使用(AOP)相关推荐

  1. AspectJ在Android 中的使用攻略

    作者 | 唯鹿       责编 | 欧阳姝黎 出品 | CSDN博客 AOP(aspect-oriented programming),指的是面向切面编程.而AspectJ是实现AOP的其中一款框架 ...

  2. Android中的AOP编程之AspectJ实战实现数据埋点

    文章背景 最近在给某某银行做项目的时,涉及到了数据埋点,性能监控等问题,那我们起先想到的有两种方案,方案之一就是借助第三方,比如友盟.Bugly等,由于项目是部署在银行的网络框架之内的,所以该方案不可 ...

  3. android aspectj 参数,AspectJ在Android中的使用

    一.AOP 全称"Aspect Oriented Programming",面向切面编程,由于面向对象的思想要求高内聚,低耦合的风格,使模块代码间的可见性变差,对于埋点,日志输出等 ...

  4. 在Android中使用AspectJ进行切面编程的简易步骤

    最近有做用户行为统计的需求,为了尽可能使统计代码不侵入业务代码,就研究了下hook和Aop. 之前写的hook方面的文章里,有评论给出了些建议,于是研究了下AspectJ,虽然还是不能完美解决项目中的 ...

  5. android studio 中怎么写aspectj代码,Android Studio 使用 AspectJ 实践AOP

    Android Studio 官方暂时不支持aspectJ,不过这里用的一款gradle插件 aspectjx 配置在project的build.gradle里配置插件dependencies { c ...

  6. android studio 中怎么写aspectj代码,AndroidStudio中 AspectJ 基础使用 简介

    AOP(Aspect Oriented Programming)切面编程在处理一些与业务逻辑无关,但在很多地方又不得不添加相关逻辑代码,可以很好的解决相关问题,比如在Android中有些地方需要打LO ...

  7. 【字节码插桩】Android 打包流程 | Android 中的字节码操作方式 | AOP 面向切面编程 | APT 编译时技术

    文章目录 一.Android 中的 Java 源码打包流程 1.Java 源码打包流程 2.字符串常量池 二.Android 中的字节码操作方式 一.Android 中的 Java 源码打包流程 Ja ...

  8. 面向切面编程AspectJ在Android埋点的实践

    在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在某个模块,要想实现对用户的行为一和行为二进行统计,因此按照OOP面向对象编程思 ...

  9. 【spring 5】AOP:spring中对于AOP的的实现

    在前两篇博客中,介绍了AOP实现的基础:静态代理和动态代理,这篇博客介绍spring中AOP的实现. 一.采用Annotation方式 首先引入jar包:aspectjrt.jar && ...

最新文章

  1. C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
  2. Windows下搭建PHP开发环境
  3. javascript检测对象中是否存在某个属性判断方法小结
  4. 阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶 1
  5. VC++下命名管道编程的原理及实现
  6. 去培训机构参加IT培训值不值
  7. 写一个脚本,判断下如果是阴历7月7日,在服务器上广播“七夕情人节快乐!”...
  8. 工作398-关于e.currentTarget.dataset的取值。
  9. linux和windows启动,Linux和Windows双系统的启动
  10. Android广播(笔记)
  11. textarea最大长度限制
  12. UNIX/Linux RHEL6.3 root密码破解,GRUB加密(图文并茂)
  13. LinkButton 传递多个参数
  14. Sublime Text 使用记录汇总
  15. 从头实现linux操作系统_从头开始实现您的第一个人工神经元
  16. 第61篇:合并多个工作薄的所有工作表
  17. Py||Is prime
  18. 通达信l2行情接口怎么用?
  19. 深度学习入门(五) softmax回归
  20. 绝对干货-国内值得关注的官方API集合,很全很强大(必须收藏)

热门文章

  1. java防止undo空间撑爆_秒杀系统设计补坑篇(seata回顾)
  2. python非阻塞输入_Python 命令行非阻塞输入的小例子
  3. linux100day(day5)--编程原理和shell脚本
  4. QT + OpenCV + MinGW 在windows下配置开发环境
  5. JWT(Json web token)认证详解
  6. AES 加密256位 错误 java.security.InvalidKeyException: Illegal key size or default parameters
  7. java合并单元格同时导出excel
  8. git github的使用
  9. 基于Linux的嵌入式浏览器的实现
  10. 经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)