spring之反射机制之Spring-DI核心实现

news2024/12/22 8:53:48

文章目录

  • 前言
  • 一、回顾反射机制之反射调用方法
    • 1、编写一个方法类SomeService
    • 2、通过反射机制调用SomeService类中的方法
  • 二、反射机制之Spring-DI核心实现


前言

调用一个方法当中含有几个要素?
1、调用哪个对象
2、调用哪个方法
3、调用方法的时候传什么参数
4、方法执行结束之后的返回结果
调用哪个对象的哪个方法,传什么参数,返回什么值
即使是使用反射机制调用方法,也同样需要具备这四个要素


一、回顾反射机制之反射调用方法

使用反射机制怎么调用方法

1、编写一个方法类SomeService

public class SomeService {
    public void doSome(){
        System.out.println("public void doSome()执行。");
    }
    public String doSome(String s){
        System.out.println("public String doSome(String s)执行。");
        return s;
    }
    public String doSome(String s,int i){
        System.out.println("public String doSome(String s,int i)执行");
        return s+i;
    }
}

2、通过反射机制调用SomeService类中的方法

1、获取类:

Class<?> clazz = Class.forName("com.bjpowernode.spring.reflect.SomeService");

2、获取方法:

getDeclaredMethod:
第一个参数:方法名
第二个参数:方法中的参数
在一个类当中,方法名是可以一样的。Java语法中允许方法重载,因此只通过方法名是获取不到方法的,需要借助第二个参数。告诉Java程序到底是哪个doSome方法。通过参数来区分方法。

Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);

3、调用方法:
四要素:调用哪个对象的哪个方法,传什么参数,返回什么值
获取对象的两种方法:

Object obj = clazz.newInstance();

如果觉得该方法已经过时,还可以通过获取类的无参数构造方法创建对象:

        //获取无参数构造方法创建对象
        Constructor<?> con = clazz.getDeclaredConstructor();
        Object obj2 = con.newInstance();
    四要素:
    //obj:哪个对象
    //doSomeMethod:哪个方法
    //"小白", 23:传什么参数
    //retValue:返回什么值
Object retValue = doSomeMethod.invoke(obj, "小白", 23);

执行结果
在这里插入图片描述
完整代码

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //获取类
        Class<?> clazz = Class.forName("com.bjpowernode.spring.reflect.SomeService");
        //获取方法 (参数:方法名,可变长)
        Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);
        //调用方法
        //四要素:调用哪个对象的哪个方法,传什么参数,返回什么值
        Object obj = clazz.newInstance();
        //获取无参数构造方法创建对象
        //Constructor<?> con = clazz.getDeclaredConstructor();
        //Object obj2 = con.newInstance();
        Object retValue = doSomeMethod.invoke(obj, "小白", 23);
        System.out.println(retValue);
    }
}

二、反射机制之Spring-DI核心实现

需求:
假设现在已知以下信息:

1、有这样一个类,类名叫做:com.bjpowernode.spring.reflect.User
2、这个类符合javabean规范。属性私有化,对外提供公开的setter和getter方法
3、知道这个类当中有一个属性,age
4、并且还知道age属性的类型是int类型

通过反射机制调用相关方法,给User对象的age属性赋值
关键在于
1、通过已知的属性名拼接出方法名:

String setMethodName = "set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);

2、根据属性名获取属性类型:

//根据属性名获取属性类型
        Field field = clazz.getDeclaredField("age");

然后直接 field.getType() 就是属性类型=int.Class

完整代码:

public class Test4 {
    public static void main(String[] args) throws Exception {
        //已知类名:
        String className = "com.bjpowernode.spring.reflect.User";
        //已知属性名:
        String propertyName = "age";

        //通过反射机制调用setAge(int)方法
        Class<?> clazz = Class.forName(className);
        //拼接set方法名
        String setMethodName = "set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);
        //根据属性名获取属性类型
        Field field = clazz.getDeclaredField("age");
        Method setAgeMethod = clazz.getDeclaredMethod(setMethodName, field.getType());
        Object o = clazz.newInstance();
        //给属性赋值
        setAgeMethod.invoke(o, 23);
        System.out.println(o);
    }
}

执行结果:
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文弄懂 React ref

前言 对于 Ref 理解与使用&#xff0c;一些读者可能还停留在用 ref 获取真实 DOM 元素和获取类组件实例层面上 其实 ref 除了这两项常用功能之外&#xff0c;还有很多别的小技巧 通过本篇文章的学习&#xff0c;你将收获 React ref 的基本和进阶用法&#xff0c;并且能够明白…

LeetCode HOT 100 —— 621. 任务调度器

题目 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行&#xff0c;并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间&#xff0c;CPU 可以完成一个任务&#xff0c;或者处于待命状态。 然…

使用 SwiftUI 布局协议构建六边形网格,如何制作在六边形网格中显示子视图的通用 SwiftUI 容器

我们将要制作的组件可以作为Swift 包使用。 SwiftUI 非常擅长构建矩形框架的层次结构。随着最近的加入,Grid它变得更好了。然而,今天我们要构建一个疯狂的六边形布局。当然,没有专门的布局类型。所以我们用协议建立我们自己的Layout! 绘制一个六边形 让我们首先为我们的…

在linux中配置redis去中心化集群

目录 前情回顾 一、集群配置 二、启动redis集群 三、检验是否成功 成功&#xff01; 前情回顾 linux中配置redis主从复制及开启哨兵模式 一、集群配置 查看所有的redis服务进程 ps -ef | grep redis 关闭所有的redis服务&#xff08;6379,6380,6381) kill -9 99168 kill …

第十章:数据库恢复技术

1、【多选题】下列哪些属于事务的特征&#xff1a; 正确答案&#xff1a; AD 2、【多选题】下列关于故障恢复的说法正确的是&#xff1a; 正确答案&#xff1a; BC 3、【多选题】下列说法错误的是&#xff1a; 正确答案&#xff1a; AB

无线通信网络优化的自动路测系统设计(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 无线通信网络是一个动态的网络&#xff0c;无线网络优化是一项贯穿于整个网络发展全过程的长期工程。在网络建成投入运营以后,…

学习笔记 - Word、WPS分别设置背景色

学习笔记 - Word、WPS分别设置背景色前言实现原理实现步骤模拟背景色1. 插入矩形形状2. 调整矩形&#xff1a;位置、文字环绕、大小。3. 调整颜色实现按节分别设置1. 插入分节符2. 取消“同前节”3. 矩形入进页眉建议场景参考资料前言 Word、WPS 都没有自带此功能。只能统一设…

node.js+uni计算机毕设项目基于微信小程序的校园快递代取平台(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

第十一章:并发控制

1、【多选题】二级封锁协议能够避免数据库哪些一致性问题 正确答案&#xff1a; AB 2、【多选题】下列说法正确的是&#xff1a; 正确答案&#xff1a; ABC 3、【多选题】下列哪些是解决死锁的方法&#xff1a; 正确答案&#xff1a; ABC

node.js+uni计算机毕设项目互联网教育系统小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

k8s-dashboard布署

k8s-dashboard布署Kubernetes dashboard作用获取Kubernetes dashboard资源清单文件修改并部署kubernetes dashboard资源清单文件访问Kubernetes dashboardKubernetes dashboard作用 通过dashboard能够直观了解Kubernetes集群中运行的资源对象通过dashboard可以直接管理&#x…

标准的晋升 PPT 长什么样子?互联网职场晋升内幕!想升职加薪?得这么干……...

如果你真的想顺利地升职加薪&#xff0c;就得从现在开始&#xff0c;重新系统地理解晋升到底是怎么回事。面评技巧导学你可能会认为&#xff0c; “是金子总会发光的”&#xff0c;只要自己能力达到了&#xff0c; 晋升就是“水到 渠成”的事情。毕竟评委的眼睛都是雪亮的&am…

node中,path.join和path.resolve的区别

1. path.join和path.resolve的区别 path.join 拼接路径能够识别 \ path.resolve 从当前的执行路径&#xff0c;解析出绝对路径不能识别 \ &#xff0c;会被当成根路径 注意下面的例子&#xff0c;是从当前的执行路径&#xff0c;解析出绝对路径 使用 process.cwd() 可以获取…

2023年中国博士后科学基金资助指南发布

今日&#xff0c;博管会发布了2023年中国博士后科学基金资助指南&#xff0c;内容上有较大的变化&#xff1a;1.面上资助不再分设一等、二等资助&#xff0c;资助标准统一调整为自然科学资助标准8万元&#xff0c;社会科学资助标准5万元&#xff1b;2.申请人申报周期从2个月调整…

AiFlow大数据框架应用简介

文章大纲1. 平台定位2. 平台特点一站建模智能分析交互分析通用部署3. 项目案例ETL 过程样例物料分类业务规则建模合作1. 平台定位 数据挖掘平台在此起到数据运营的承上启下的环节&#xff0c;主要负责数据的挖掘分析、ETL、数据检测。 平台支持自动建模、可视化交互建模、嵌入…

JavaScript:队列的封装及面试题击鼓传花队列方法实现案例

队列的定义&#xff1a;队列简称队。是一种操作受限的线性表&#xff0c;只允许在表的一端进行插入&#xff0c;而在表的另一端进行删除。向队列中插入元素称为入队或进队&#xff1b;删除元素称为出队或离队。其操作特性为先进先出&#xff08;First In First Out&#xff0c;…

【金猿人物展】天云数据雷涛:从数据湖到湖仓一体再到数据编织,完成的是燃油车到油电混再到纯电技术的改造...

‍雷涛本文由天云数据CEO雷涛撰写并投递参与“数据猿年度金猿策划活动——2022大数据产业趋势人物榜单及奖项”评选。‍数据智能产业创新服务媒体——聚焦数智 改变商业这一两年&#xff0c;北美以Facebook、谷歌为驱动的存算分离的虚拟数仓架构&#xff0c;正在非常快速的洗牌…

【408篇】C语言笔记-第十七章(考研必会的排序算法(下))

文章目录第一节&#xff1a;选择排序1. 选择排序原理解析2. 选择排序代码实战3. 时间复杂度与空间复杂度第二节&#xff1a;堆排序1. 堆排序原理解析2. 堆排序代码实战3. 时间复杂度与空间复杂度第三节&#xff1a;归并排序1. 归并排序原理解析2. 归并排序代码实战3. 时间复杂度…

5、前端笔记-JS-运算符

运算符也被称为操作符&#xff0c;用于实现赋值、比较和执行算数运算等功能的符号 常用的运算符&#xff1a; 算数运算符、递增和递减运算符、比较运算符、逻辑运算符、赋值运算符 1、算术运算符 -*/% - * / %&#xff08;1&#xff09;%取余可以用来判断一个数是否可以被整除…

家政清洁服务系统设计与实现

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 修改意见&#xff1a;题目改为“家政清洁服务系统设计与实现” 提供服务&#xff1a;钟点打扫卫生&#xff08;按小时收…