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

Kotlin 使用 Springboot 反射执行方法并自动传参

在使用反射的时候,执行方法的时候在想如果Springboot 能对需要执行的反射方法的参数自动注入就好了。所以就有了下文。

知识点

  • 获取上下文
  • 通过上下文获取 Bean
  • 通过上下文创建一个对象,该对象所需的参数由 Springboot 自己注入
  1. 创建参数

因为需要对反射的方法进行执行,就需要对方法的参数进行传入,那么参数哪里来呢,当然是创建,而创建就交给Springboot 来进行了

注意:Springboot 创建 Bean 需要你注入 ApplicationContext

// 调用这个方法可以获取 bean 如果没有则创建。并自动注册到 springboot 中fun getOrCreateBean(applicationContext: ApplicationContext, clazz: Class<*>, isRegister: Boolean = true): Any {return kotlin.runCatching {applicationContext.getBean(clazz)}.getOrDefault(applicationContext.autowireCapableBeanFactory.createBean(clazz).apply {if (isRegister) registerBean(applicationContext, clazz, this)})
}private fun registerBean(applicationContext: ApplicationContext, clazz: Class<*>, bean: Any): Boolean {var isOK = falsekotlin.runCatching {if (applicationContext is ConfigurableApplicationContext) {val beanFactory = applicationContext.beanFactory as DefaultListableBeanFactoryif (!applicationContext.containsBean(clazz.simpleName)) {beanFactory.registerSingleton(clazz.simpleName, bean)isOK = true} else {if (!applicationContext.containsBean(clazz.name)) {beanFactory.registerSingleton(clazz.name, bean)isOK = true}}}}return isOK
}
  1. 反射调用方法
val method = clazz.methods.filter { it.name == "test" }.first()val params = method.parameters.map {getOrCreateBean(applicationContext, it.type)
}.toTypedArray()method.invoke(bean, *params)
  1. applicationContext

如果你不知道 applicationContext 如何注入可以看下面代码

@Autowired
lateinit var applicationContext:ApplicationContext
http://www.lryc.cn/news/530371.html

相关文章:

  • 网络安全技术简介
  • nginx 报错404
  • 【1.安装ubuntu22.04】
  • 【设计模式-行为型】备忘录模式
  • Linux环境下的Java项目部署技巧:安装 Mysql
  • 云原生(五十三) | SQL查询操作
  • 【前端知识】常用CSS样式举例
  • 硕成C语言1笔记
  • [SAP ABAP] Debug Skill
  • 理解 InnoDB 如何处理崩溃恢复
  • UE5 蓝图学习计划 - Day 8:触发器与交互事件
  • 根据接口规范封装网络请求和全局状态管理
  • Unet 改进:在encoder和decoder间加入TransformerBlock
  • work-stealing算法 ForkJoinPool
  • DeepSeek Janus-Pro:多模态AI模型的突破与创新
  • STM32-时钟树
  • hot100_21. 合并两个有序链表
  • 代码讲解系列-CV(一)——CV基础框架
  • C++ Primer 标准库类型string
  • 计算机网络安全与运维的关键 —— 常用端口全解析
  • Vue.js 的介绍与组件开发初步
  • 【仿12306项目】通过加“锁”,解决高并发抢票的超卖问题
  • wow-agent---task4 MetaGPT初体验
  • MVANet——小范围内捕捉高分辨率细节而在大范围内不损失精度的强大的背景消除模型
  • 94,【2】buuctf web [安洵杯 2019]easy_serialize_php
  • LabVIEW如何有效地进行数据采集?
  • 6 [新一代Github投毒针对网络安全人员钓鱼]
  • 《Origin画百图》之脊线图
  • linux 函数 sem_init () 信号量、sem_destroy()
  • Kafka架构