android studio 中怎么写aspectj代码,AndroidStudio中 AspectJ 基础使用 简介
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 基础使用 简介相关推荐
- android studio 2.3.1 r丢失,AndroidStudio中 R文件缺失的办法
flex自适应小例子 libcurl使用easy模式阻塞卡死等问题的完美解决 引言: 由于要在android手机测进行DM开发, 其中最重要的就是FUMO和SCOMO下载, 下载使用的是linux开源 ...
- Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...
- Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld
前言(Prologue) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Android ...
- Android Studio 实现将视频资源嵌入APP中
Android Studio 实现将视频资源嵌入APP中 (直取思路跟代码跳转文末,如有帮助勿忘分享点赞奥!你的支持是我更新的动力!) 在正文之前首先想给大家引入安卓数据存储路径: 内部存储inter ...
- [安卓开发笔记二]android Studio通过jni调用C++代码
[安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...
- android studio 导入模块SDK 以及该模块中继承application的类与原工程继承application的类存在冲突 解决方法
android studio 导入模块SDK 以及该模块中继承application的类与原工程继承application的类存在冲突 解决方法 导入某修改后的海康视频SDK(老师给的),并修改相关文 ...
- Android Studio 单刷《第一行代码》系列目录
本文转载自: http://www.cnblogs.com/debuglife/p/4355687.html 作者:DebugLife 转载请注明该声明. 前言(Prologue) 本系列将使用 An ...
- Android Studio 单刷《第一行代码》系列 07 —— Broadcast 广播
前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...
- Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命周期
前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...
最新文章
- 深度解析Python的内存管理机制:垃圾回收机制
- 10、MySQL存储引擎有哪些?
- Visual Studio 2017 Android 调试无法连接到虚拟机
- 移动混合应用HTML5数据查询优化
- System.Collections深入探讨--如何创建自定义的集合类
- python 从入门到实践_Python编程从入门到实践日记Day36
- RegExp(正则表达式对象)
- 多功能AD杀手AD7124 效果理想 原理图经验分享+实物图
- 1.MATLAB简介
- TFTP服务器的搭建与使用
- 美丽中国 纪录片 高频词 GRE 托福词汇
- mysql 存储过程 if !=_mysql 存储过程 if !=
- 如何学计算机打字,电脑如何快速学会打字
- ThinkPad R480 C盘 固态128G 升级到 512G + 系统无缝迁移,不用重装软件
- CentOs虚拟机硬盘扩容
- 创业,I have a dream
- mysql表被锁住/表打不开 Waiting for table metadata lock
- 天源财富:突破“极限”!我科学家发现迄今最高能量光子
- oracle19自动索引,Oracle 19c 新特性详解:自动索引(Automatic Indexing)的输出报告范例...
- Python可视化工具