我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JAVA:面向切面编程AOP

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JAVA:面向切面编程AOP

        把某一些功能提取出来与某一对象进行隔离,提取之后可以对某哥单方面的功能进行修改和扩展

        也就是把众多方法中的的所有公共代码抽取出来,放到某个地方集中管理

        对业务逻辑的各个部分进行了隔离,从而降低业务逻辑各部分之间的耦合,提高程序的可重用性,提高开发效率。

  1. 动态代理(AOP),比如说用动态代理去判断MVP中的model是否为空
  2. 在application中对activity注册生命周期的监听
  3. 基于第三方的编译工具:APT、AspectJ、Javassist等

        OOP是把问题划分到单个模块

        AOP是把涉及到众多模块的某一类问题进行统一管理,

  • 参数校验和判空
  • 权限检测、网络检测等 
  • 埋点
  • 安全控制
  • 日志记录
  • 性能统计
  • 异常处理
    替代防御性的 try-Catch

  • 缓存
    缓存某方法的返回值,下次执行该方法时,直接从缓存里获取

  • 热修复

@Aspect:声明切面,标记类
@Pointcut(切点表达式):定义切点,标记方法
@Before(切点表达式):前置通知,切点之前执行
@Around(切点表达式):环绕通知,切点前后执行
@After(切点表达式):后置通知,切点之后执行
@AfterReturning(切点表达式):返回通知,切点方法返回结果之后执行
@AfterThrowing(切点表达式):异常通知,切点抛出异常时执行
 
注:如果没有添加@Aspect,那么后面的注解一律不起作用

在项目下gradle添加依赖

buildscript {    repositories {        mavenCentral()    }    dependencies {        classpath 'org.aspectj:aspectjtools:1.8.9'        classpath 'org.aspectj:aspectjweaver:1.8.9'    }}plugins {    ……}

在使用的模块gradle添加

import org.aspectj.bridge.IMessageimport org.aspectj.bridge.MessageHandlerimport org.aspectj.tools.ajc.Mainandroid {    ……} final def log = project.loggerfinal 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.8",                         "-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;            }        }    }}dependencies {    ……    implementation 'org.aspectj:aspectjrt:1.8.9'}

创建注解,标记切点

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)ButterKnife   SOURCE 代表资源public @interface CheckNet {}

处理切点

@Aspect //声明切面public class SectionAspect {        @Pointcut("execution(@com.darren.architect_day02.CheckNet * *(..))")    public void checkNetBehavior() {    }        @Around("checkNetBehavior()")    public Object checkNet(ProceedingJoinPoint joinPoint) throws Throwable {        MethodSignature signature = (MethodSignature) joinPoint.getSignature();        CheckNet checkNet = signature.getMethod().getAnnotation(CheckNet.class);        if (checkNet != null) {            Object object = joinPoint.getThis();            Context context = getContext(object);            if (context != null) {                if (!isNetworkAvailable(context)) {                    //处理公共事件                    Toast.makeText(context,"请检查您的网络",Toast.LENGTH_LONG).show();                    return null;                }            }        }        return joinPoint.proceed();    }}

        运行时,使用了aspectJ第三方编译器,aspectJ去修改class文件,不影响性能

来源地址:https://blog.csdn.net/weixin_42277946/article/details/131034556

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JAVA:面向切面编程AOP

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Java AOP实现面向切面编程

面向切面编程(AOP)是一种编程思想,它将程序中的关注点分离,使得开发人员可以专注于核心业务逻辑而不必过多关注横切关注点。

Java面向切面编程AOP怎么实现

这篇文章主要介绍“Java面向切面编程AOP怎么实现”,在日常操作中,相信很多人在Java面向切面编程AOP怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java面向切面编程AOP怎么实现”的疑惑有所
2023-06-04

Java aop面向切面编程有什么特点

面向切面编程(AOP)是一种软件开发范式,用于将横切关注点(cross-cutting concerns)与主要业务逻辑分离。AOP 可以在不改变原始代码的情况下,通过引入切面(aspect)对应用程序进行功能增强、横切关注点的处理等操作
Java aop面向切面编程有什么特点
2024-03-01

【Spring】面向切面编程详解(AOP)

文章目录 一、AOP概述什么是AOPAOP应用场景 二、AOP的基本术语术语介绍术语举例详解 三、AOP实例说明四、通知类型详解概述前置通知后置通知环绕通知最终通知 六、AOP实现声明式事务
2023-08-30

利用Java AOP实现面向切面编程的关键技术

Java AOP 是基于 Java 语言的实现方式,基于动态代理和反射机制,提供了一种在运行时对程序进行拦截和修改的能力,使得程序员能够以更加灵活和方便的方式处理横切逻辑。本文将介绍利用 Java AOP 实现面向切面编程的关键技术。
Java技术2024-11-30

Springboot怎样使用Aspectj实现AOP面向切面编程

Springboot怎样使用Aspectj实现AOP面向切面编程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。要在 Springboot中声明 AspectJ 切面需在 IOC
2023-06-22

Python面向切面编程AOP及装饰器怎么使用

本篇内容主要讲解“Python面向切面编程AOP及装饰器怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python面向切面编程AOP及装饰器怎么使用”吧!什么是 AOPAOP,就是面向切
2023-06-30

Java面向切面编程怎么实现

在Java中实现面向切面编程,可以使用以下几种方式:1. 使用代理模式:通过创建代理类,将横切逻辑封装在代理类中,然后在实际业务类中使用代理类进行调用。代理类可以使用Java提供的动态代理(java.lang.reflect.Proxy)或
2023-08-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录