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

javaCompile.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.logger

for (IMessage message : handler.getMessages(null, true)) {

switch (message.getKind()) {

case IMessage.ABORT:

case IMessage.ERROR:

case IMessage.FAIL:

log.error message.message, message.thrown

break;

case IMessage.WARNING:

case IMessage.INFO:

log.info message.message, message.thrown

break;

case IMessage.DEBUG:

log.debug message.message, message.thrown

break;

}

}

}

}

以上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.javaCompile

javaCompile.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.thrown

break;

case IMessage.WARNING:

log.warn message.message, message.thrown

break;

case IMessage.INFO:

log.info message.message, message.thrown

break;

case IMessage.DEBUG:

log.debug message.message, message.thrown

break;

}

}

}

}

以上配置主要是将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();

}

}

注解运行如下:

android studio 中怎么写aspectj代码,AndroidStudio中 AspectJ 基础使用 简介相关推荐

  1. android studio 2.3.1 r丢失,AndroidStudio中 R文件缺失的办法

    flex自适应小例子 libcurl使用easy模式阻塞卡死等问题的完美解决 引言: 由于要在android手机测进行DM开发, 其中最重要的就是FUMO和SCOMO下载, 下载使用的是linux开源 ...

  2. Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  3. Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld

    前言(Prologue) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Android ...

  4. Android Studio 实现将视频资源嵌入APP中

    Android Studio 实现将视频资源嵌入APP中 (直取思路跟代码跳转文末,如有帮助勿忘分享点赞奥!你的支持是我更新的动力!) 在正文之前首先想给大家引入安卓数据存储路径: 内部存储inter ...

  5. [安卓开发笔记二]android Studio通过jni调用C++代码

    [安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...

  6. android studio 导入模块SDK 以及该模块中继承application的类与原工程继承application的类存在冲突 解决方法

    android studio 导入模块SDK 以及该模块中继承application的类与原工程继承application的类存在冲突 解决方法 导入某修改后的海康视频SDK(老师给的),并修改相关文 ...

  7. Android Studio 单刷《第一行代码》系列目录

    本文转载自: http://www.cnblogs.com/debuglife/p/4355687.html 作者:DebugLife 转载请注明该声明. 前言(Prologue) 本系列将使用 An ...

  8. Android Studio 单刷《第一行代码》系列 07 —— Broadcast 广播

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  9. Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命周期

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

最新文章

  1. 揭秘PHP深受Web开发者喜爱的原因
  2. 地图漫游功能的具体体现_骏谷科技|数据中心三维可视化管理系统功能亮点
  3. Redis-17Redis内存回收策略
  4. MathLab混合编程成功总结
  5. HDU 2833 WuKong
  6. 牛客题霸 NC19 子数组的最大累加和问题
  7. 使用 XMLBeans 进行编程 XMLBeans 如何引发数据绑定的巨大变革
  8. 项目添加JWT工具类
  9. readSerializableObj
  10. 6计算机系统的组成是,计算机系统的组成(范文)(6页)-原创力文档
  11. [蓝桥杯2018决赛]最大乘积-dfs
  12. 机器学习的练功方式(四)——KNN算法
  13. get_class 方法
  14. matla工具箱 SerialLink 的一些最近发现的功能
  15. js工作笔记001---javascript中(function($){...})(jQuery)写法是什么意思
  16. flex中的架构,(举例UIComponent类的继承关系)
  17. 键、索引、约束及其区别
  18. HDU 3480 Division(斜率DP裸题)
  19. vscode好用的扩展及常用的快捷键
  20. 绿盟安全扫描--检测到目标站点存在javascript框架库漏洞

热门文章

  1. 为提升 DCP 传输效率,阿里工程师竟然这样做!
  2. 开幕倒计时3天 | 2019中国大数据技术大会(BDTC)邀您一同共赴大数据+AI盛宴!...
  3. 如何彻底搞懂面向 Web 开发者的正则表达式?
  4. 性能比 GPU 高 100 倍!首款可编程忆阻器 AI 计算机面世
  5. 从3年前接触区块链,到开发出装机量最大客户端Geth,看看人家的职业发展之路 | 人物志...
  6. Unity 和腾讯游戏成立联合创新实验室:从技术创新探索游戏产品新模式和概念
  7. 谁该为马化腾表态这个乌龙尴尬?
  8. 程序员渴望的“无代码世界”要来了!
  9. 《绝地求生》外挂源码被公布后,腾讯蓝洞再次出招打压!
  10. CES 2018 七大看点前瞻:模块化电视、枪型游戏设备……