IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android - AOP - Aspectj 基本使用 -> 正文阅读

[移动开发]Android - AOP - Aspectj 基本使用

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程
简单的理解就是可以对某些方法进行拦截,二次加工.

比较火的开源库是:
https://mvnrepository.com/artifact/org.aspectj/aspectjweaver/1.9.6

Android 项目,如果觉得直接使用麻烦的话,可以使用开源库
https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx

一、集成环境到 Android Studio
1.在项目的 build.gradle 添加 classpath
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
2.在对应 module(app) 的 build.gradle 顶部添加插件
apply plugin: 'android-aspectjx'
在运行的那个 app 的 module 里添加就够了,其他的module 如过没报错可以不添加

二、编写测试代码
我在最开始的时候,一直以为项目没有集成进去,其实是我代码写错了,
所以,简单的测试代码显的特别重要。

package org.itzheng.aop;

import android.util.Log;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class TestAop {
    @Before("execution(* on*(..))")
    public void testBefore() {
        Log.w("aop", "TestAop testBefore: ");
    }
}

运行App,输出 很多?
W/aop: TestAop testBefore:
W/aop: TestAop testBefore:

说明环境安装没问题.

三、拦截器介绍
@Before:这种拦截器先执行拦截代码,再执行目标代码。如果拦截器抛异常,那么目标代码就不执行了;
@After:这种拦截器先执行目标代码,再执行拦截器代码。无论目标代码是否抛异常,拦截器代码都会执行;
@AfterReturning:和@After不同的是,只有当目标代码正常返回时,才执行拦截器代码;
@AfterThrowing:和@After不同的是,只有当目标代码抛出了异常时,才执行拦截器代码;
@Around:能完全控制目标代码是否执行,并可以在执行前后、抛异常后执行任意拦截代码,可以说是包含了上面所有功能。

四、表达式介绍(参考:@Pointcut注解表达式介绍_XWForever的专栏-CSDN博客)
官网:Core Technologies
1.execution 最基本的表达式
? ? ? ? 语法:execution([@注解全名]?[访问修饰符] 返回类型 [包类.方法名称(方法参数)] [异常])
? ? ? ? [] 代表可选参数
? ? ? ? 如:execution(public void *.on*(..))
? ? ? ? ? ? execution(@注解名 * *(..))

2.@annotation?用于匹配方法上拥有指定注解的情况
? ? ? ? 如:@annotation(time)
? ? ? ? 在拦截方法上需要传入 参数名为 time 的注解

    @Around("@annotation(time)")
    public Object joinPoint(ProceedingJoinPoint joinPoint,ExecTime time) throws Throwable{}

3.within?用来指定类型的,指定类型中的所有方法将被拦截。
????????如:within(org.itzheng.aop..*) 当前包下所有类
? ? ? ? ? ??within(org.itzheng.aop.ACD) ACD类

更多表达式可以查看参考网页

五、通配符
* 任意一个
.. 多个
比如:

返回类型为任意类型: *
某个包下的所有类,不包括子包:a.b.c.*
某个包下的所有类,的所有方法,不包括子包:a.b.c.*.*(..)
某个包下的所有类,包括子包:a.b.c..*
某个包下的所有类,的所有方法,包括子包:a.b.c..*.*(..)
以on开头的无参方法: on*()
以on开头的不限参数方法:on*(..)


六、多条件组合
Pointcut 可以将某个条件定义到一个方法上,然后通过多个方法组合
表达式:&&? ?||? ?!
如:

    //定义:
     @Pointcut("execution(* *())")
     private void pointcut1()

     @Pointcut("execution(* *())")
     private void pointcut2()

     //使用符合条件1但是不符合条件2的所有方法
     @Around("pointcut1() && !pointcut2()")
     public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {}

七、更多条件示例
?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 18:56:29  更:2021-09-11 18:58:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:29:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码