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

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 = false
   kotlin.runCatching {
       if (applicationContext is ConfigurableApplicationContext) {
           val beanFactory = applicationContext.beanFactory as DefaultListableBeanFactory
           if (!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.kler.cn/a/531853.html

相关文章:

  • 使用scikit-learn中的K均值包进行聚类分析
  • opencv图像处理框架
  • 如何利用DeepSeek打造医疗领域专属AI助手?从微调到部署全流程解析
  • C语言 --- 分支
  • SSRF 漏洞利用 Redis 实战全解析:原理、攻击与防范
  • Error: Expected a mutable image
  • golang命令大全8--跨平台构建
  • git 新项目
  • Unity游戏(Assault空对地打击)开发(4) 碰撞体和刚体的添加
  • Hugging Face GGUF 模型可视化
  • 【Redis_1】初识Redis
  • DeepSeek:人工智能领域的革新者与未来展望
  • VoIP中常见术语
  • Denavit-Hartenberg DH MDH坐标系
  • 【人工智能学习笔记 一】 AI分层架构、基本概念分类与产品技术架构
  • LabVIEW双光子成像系统:自主创新,精准成像,赋能科研
  • 文本预处理
  • Springboot中@Autowired和@Resource注解的区别和联系
  • Docker 安装详细教程(适用于CentOS 7 系统)
  • 金山打字游戏2010绿色版,Win7-11可用DxWnd完美运行
  • 【PyQt】getattr动态访问对象的属性
  • leetcode——二叉树展开为链表(java)
  • 从 C 到 C++:理解结构体中字符串的存储与操作
  • chrome浏览器chromedriver下载
  • 大数据数仓实战项目(离线数仓+实时数仓)1
  • 《逆向工程核心原理》第一~二章知识整理