HTML框架 程序设计 全局重载运算符 neo4j eking文件 react router 后台页面模板 郑州普通话考试 河南普通话考试 jquery解析json数据 mysql数据库名称 mysql降序 mysql安装后怎么使用 hbuilder插件 kubernetes视频 python开发环境 python中的range函数 python的random模块 python中文教程 简单python脚本实例 java案例 javaswitch语句 java的for循环 java集合遍历 java入门代码 java中的集合 海鸥浏览器 黑白照片一键变彩色 workflow中文 全英雄守城战 apihook 电脑待机费电吗 软媒u盘启动 摸摸头不哭表情包 excel转csv hexdump 安卓ui框架 画吧教程 js添加节点 vba下载
当前位置: 首页 > 学习教程  > 编程语言

Android AspectJ使用

2021/4/19 23:34:11 文章标签:

文章目录AspectJ使用概述依赖库AspectJ介绍JoinPoints 切入点Advice 通知通配符切点表达式案例基本实现AspectJ使用 概述 OOP 面向对象编程:问题或功能都被划分在一个一个点模块里,每个模块专心做自己的事情,模块之间通过设计好的接口交互…

文章目录

  • AspectJ使用
    • 概述
    • 依赖库
    • AspectJ介绍
      • JoinPoints 切入点
      • Advice 通知
      • 通配符
      • 切点表达式
      • 案例
    • 基本实现

AspectJ使用

概述

OOP

面向对象编程:问题或功能都被划分在一个一个点模块里,每个模块专心做自己的事情,模块之间通过设计好的接口交互。

AOP

面向切面编程:由于OOP推崇高内聚、低耦合的风格,导致模块之间的可见性变差,不利于权限拦截、日志输出等功能,AOP技术应用而生,因此AOP是对OOP的补充和完善,将一些功能集中起来进行统一管理。

AspectJ

AspectJ是一个流行的Java AOP扩展框架。

依赖库

项目下

dependencies {
    classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
}

模块下

apply plugin : 'android-aspectjx'

dependencies {
    implementation 'org.aspectj:aspectjrt:1.9.6'
}

控制AspectJ

//关闭AspectJX功能
aspectjx {
	enabled false
}
//AOP配置(exclude 和 include 二选一)
aspectjx {
    // 只对以下包名做 AOP 处理
    include 'com.example.app'
}

AspectJ介绍

JoinPoints 切入点

JoinPoints说明语法
method call函数调用call(MethodSignature)
method execution函数执行execution(MethodSignature)
constructor call构造函数被调用call(Constructorsignature)
constructor execution构造函数执行execution(constructorSignature)
field get读变量get(FieldSignature)
field set写变量set(FieldSignature)
static initializationstatic块初始化staticinitializattion(TypeSignature)
handler异常处理handler(TypeSignature) 只能和@Before()配合使用

Advice 通知

Advice说明
@Before(Pointcut)在切入点之前执行
@After(Pointcut)在切入点之后执行
@Around(Pointcut)替代原来的代码,可以通过ProceedingJoinPoint.procedd()执行切入点代码
不支持@Before()/@After()一起使用
@AfterReturning(Pointcut)在切入点返回结果之后执行
@AfterThrowing(Pointcut)在切入点抛出异常之后执行

通配符

Signature语法
*除“.”以外任意字符串
任意参数列表
+子类

切点表达式

@注解 访问权限 返回值类型 类名.方法名 (参数)
语法说明
@注解注解类的完整路,如果没有则不写
访问权限public/private/protected/static/final,如果没有则不写
返回值类型如果不限定类型,可以使用通配符*
类名.方法名可以使用通配符 * 和 … 和 +
参数int(int,char) 表示参数有2个
(String…) 表示至少一个String参数
(Object…) 表示不定个数的参数

案例

//切入点为Animal类setOn开头的方法
@Pointcut("call(* com.example.app.Animal.setOn*(..))")
public void pointcut1() {
}

基本实现

public class Animal {
    public void eat() {
        Log.e("TAG", "eat()");
    }
}
@Aspect
public class MyAspect {

    /**
     * 方法切入点
     */
    @Pointcut("call(* com.example.app.Animal.eat())")
    public void callMethod() {
    }

    /**
     * 在切入点之前执行
     */
    @Before("callMethod()")
    public void onBefore(JoinPoint joinPoint) {
        Log.e("TAG", "onBefore");
    }
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Animal animal=new Animal();
        animal.eat();
    }
}

输出;

onBefore
eat()

本文链接: http://www.dtmao.cc/news_show_942365.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?