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

server/2025/2/4 19:23:28/

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

知识点

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

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

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

kotlin">// 调用这个方法可以获取 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. 反射调用方法
kotlin">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 如何注入可以看下面代码

kotlin">@Autowired
lateinit var applicationContext:ApplicationContext

http://www.ppmy.cn/server/164959.html

相关文章

Java 大视界 -- Java 大数据在量子通信安全中的应用探索(69)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Spark Streaming的背压机制的原理与实现代码及分析

Spark Streaming的背压机制是一种根据JobScheduler反馈的作业执行信息来动态调整Receiver数据接收率的机制。 在Spark 1.5.0及以上版本中&#xff0c;可以通过设置spark.streaming.backpressure.enabled为true来启用背压机制。当启用背压机制时&#xff0c;Spark Streaming会自…

CSS Module 常用笔记

Date: January 30, 2025 CSS 先介绍下普通 CSS&#xff0c;再简明介绍下 css module 的使用 普通 CSS 内联 style 定义&#xff1a; 内联 style 是通过在元素的 style 属性中直接设置 CSS 样式。这种方式允许我们直接在 JSX 中为组件或元素添加样式。 写法&#xff1a; &…

二叉树——102,107,199,637

前中后序遍历是二叉树的深度遍历&#xff0c;而层序遍历则是二叉树的广度遍历。顾名思义&#xff0c;二叉树的层序遍历就是一层一层遍历二叉树的每一个节点。今天的几道题都是关于二叉树的层序遍历的&#xff0c;大体思路都非常相似&#xff0c;都是在层序遍历的基础上实现了有…

搜索与图论复习1

1深度优先遍历DFS 2宽度优先遍历BFS 3树与图的存储 4树与图的深度优先遍历 5树与图的宽度优先遍历 6拓扑排序 1DFS&#xff1a; #include<bits/stdc.h> using namespace std; const int N10; int n; int path[N]; bool st[N]; void dfs(int u){if(nu){for(int i0;…

什么是门控循环单元?

一、概念 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;GRU&#xff09;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;由Cho等人在2014年提出。GRU是LSTM的简化版本&#xff0c;通过减少门的数量和简化结构&#xff0c;保留了LSTM的长时间依赖…

C语言--分支循环实践:猜数字游戏

在这次的实践项目中&#xff0c;需要编写一个可以在控制台运行的猜数字的游戏。 1. 游戏要求 电脑自动生成1~100的随机数玩家输入要猜的数字&#xff0c;猜数字的过程中根据猜的数字的大小给出猜大了猜小了的反馈&#xff0c;直到猜对游戏结束。 2. 游戏设计思路 2.1 游戏界…

python算法和数据结构刷题[1]:数组、矩阵、字符串

一画图二伪代码三写代码 LeetCode必刷100题&#xff1a;一份来自面试官的算法地图&#xff08;题解持续更新中&#xff09;-CSDN博客 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 面试经典 150 题 - 学习计…