当前位置: 首页 > news >正文

【Kotlin】在Kotlin项目中使用AspectJ

前言

AOP编程在Java开发中是一个非常火热的话题,最著名的库为AspectJ

Kotlin项目中,通过Gradle插件,也能够使用该库,这是我们下面讲解的重点

由于AspectJ的原理是在预编译阶段,通过插件修改代码,生成代理对象

属于编译阶段的功能,因为非常依赖编译工具的版本

这里用的版本是Gradle8.7,如果不兼容记得调整版本号

Gradle脚本代码,用的也是Gradle8.7+KotlinScript的语法,记得根据版本调整

引入插件依赖
pluginManagement {plugins {id("org.jetbrains.kotlin.jvm") version "1.9.23" apply falseid("io.freefair.aspectj.post-compile-weaving") version "8.7.1" apply false}
}dependencyResolutionManagement {repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOSrepositories {mavenCentral()gradlePluginPortal()}
}
应用插件到模块
plugins {id("org.jetbrains.kotlin.jvm")id("io.freefair.aspectj.post-compile-weaving")
}dependencies {api("org.aspectj:aspectjrt:1.9.6")api("org.aspectj:aspectjweaver:1.9.6")
}
Kotlin代码
package com.code.kotlinfun main() {Good().doSomething()
}class Good {fun doSomething() {println("doSomething")}
}
AOP规则

插件会自动搜索带有@Aspect注解的文件

@Pointcut通过特征表达式,来指定切入点,即要拦截哪些方法

@Before @After指定切入方式,即在什么时机切入,方法执行前,还是方法执行后

其它更详细的注解,大家自己根据需要去了解,这里主要讲解集成和使用方式

package com.code.kotlinimport org.aspectj.lang.JoinPoint
import org.aspectj.lang.annotation.After
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.aspectj.lang.annotation.Pointcut@Aspect
class AspectRule {@Pointcut("execution(* com.code.kotlin.Good.doSomething(..))")fun anyFunction() {}@Before("anyFunction()")fun beforeFunction(joinPoint: JoinPoint) {println("before function executed: $joinPoint")}@After("anyFunction()")fun afterFunction(joinPoint: JoinPoint) {println("after function executed: $joinPoint")}
}
运行结果
before function executed: execution(void com.code.kotlin.Good.doSomething())
doSomething
after function executed: execution(void com.code.kotlin.Good.doSomething())
优势分析

可以看到,简单引入和应用插件即可

AOP代码完全独立于原始代码,真正做到了代码解耦

非常适合对关键位置代码进行监听和修改的需求

注意事项

由于生成的代码依赖于Gradle插件

所以AOP规则修改后,如果代码没生效,可以尝试Reload一下Gradle脚本

另外,此插件和安卓编译插件,在实现方式上容易产生版本冲突

安卓项目需要使用AOP,建议使用其它插件,这个我们下一章会讲解

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python核心编程--Python要点总结
  • Swift 内存管理:精通强、弱、无主之地
  • IOS半越狱工具nathanlr越狱教程
  • 计算机毕业设计选题推荐-Cosplay论坛系统-Java/Python项目实战
  • 【UE5.1】NPC人工智能——06 NPC攻击
  • 在Ubuntu 部署 Grafana且监控MySQL数据
  • PDF文件切割,无大小限制
  • WPF中的XAML是如何转换成对象的?
  • react面试题一
  • Vue实现表格数据的增删改查
  • 死锁如何产生及避免
  • 【计算机三级-数据库技术】操作题大题(第六套)
  • python数组列表操作简记二
  • MS SQL Server partition by 函数实战二 编排考场人员
  • 提升录制效率,这些录屏软件快捷键你不可不知
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • C++11: atomic 头文件
  • JavaScript DOM 10 - 滚动
  • Python 基础起步 (十) 什么叫函数?
  • 安装python包到指定虚拟环境
  • 飞驰在Mesos的涡轮引擎上
  • 关于 Cirru Editor 存储格式
  • 猴子数据域名防封接口降低小说被封的风险
  • 技术:超级实用的电脑小技巧
  • 类orAPI - 收藏集 - 掘金
  • 前端代码风格自动化系列(二)之Commitlint
  • 删除表内多余的重复数据
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 数据仓库的几种建模方法
  • 详解移动APP与web APP的区别
  • 如何正确理解,内页权重高于首页?
  • ​ArcGIS Pro 如何批量删除字段
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (备忘)Java Map 遍历
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (六)c52学习之旅-独立按键
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • ./configure,make,make install的作用(转)
  • .“空心村”成因分析及解决对策122344
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .net流程开发平台的一些难点(1)
  • .NET设计模式(11):组合模式(Composite Pattern)
  • /etc/fstab 只读无法修改的解决办法
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • :中兴通讯为何成功
  • @Data注解的作用
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [<MySQL优化总结>]
  • [android学习笔记]学习jni编程