当前位置: 首页 > 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,建议使用其它插件,这个我们下一章会讲解

http://www.lryc.cn/news/427907.html

相关文章:

  • web实现drag拖拽布局
  • Linux网络编程—listen、accept、connect
  • logback.xml自定义标签节点
  • 探索DevExpress WinForms:.NET世界中的UI库之星
  • 零基础学习Redis(4) -- 常用数据结构介绍
  • Python实现水果忍者(开源)
  • Windows自动化3️⃣WindowsPC拽起时长问题解决方案
  • 一篇文章入门Java虚拟机(JVM)
  • vue3里面的组件实例类型(包括原生的html标签类型)
  • 谷歌正式开放Imagen 3访问权限!OpenAI的GPT-4o连续两周迎来两次更新!|AI日报
  • C语言内存操作函数
  • 深入探索 PyTorch:torch.nn.Parameter 与 torch.Tensor 的奥秘
  • 成为Python砖家(1): 在本地查询Python HTML文档
  • 深度学习基础—RMSprop算法与Adam 优化算法
  • 单片机原理及技术(六)—— 中断系统的工作原理
  • Angular路由使用
  • 【JVM】深入理解类加载机制(一)
  • 区块链浏览器需求整理
  • Laravel 表单验证功能重定向判断
  • MATLAB口罩检测系统
  • LeetCode 第三十一天 2024.8.18
  • Linux驱动学习之点灯(一)
  • 从HTTP到HTTPS:SSL加密如何重塑互联网安全格局
  • QT网络编程: 实现UDP通讯设置
  • 机器学习第十一章--特征选择与稀疏学习
  • dm 到 dm 的 HS 同步部署
  • ShardingSphere、雪花算法、分布式id生成器CosID概述
  • hive学习(四)
  • UniAD_面向规划的自动驾驶
  • 《现代情报》