文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

JAVA:面向切面编程AOP

2023-09-12 12:57

关注

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

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

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

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

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

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

@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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯