Spring学习记录---回顾反射机制

目录

10.回顾反射机制

10.1 分析方法四要素

//不使用反射机制调用这些方法

使用反射机制调用方法

代码:

运行结果:

 10.4 假设你知道属性名

测试代码

运行结果


10.回顾反射机制

10.1 分析方法四要素

package com.dong.reflect;public class SomeService {public void doSome(){System.out.println("public void doSome() 执行!!");}public String doSome(String s){System.out.println("public String doSome() 执行!!");return s;}public String doSome(String s,int i){System.out.println(" public String doSome(String s,int i) 执行!!");return s+i;}
}
  • //不使用反射机制调用这些方法

package com.dong.reflect;public class Test {public static void main(String[] args) {//不使用反射机制调用这些方法SomeService someService=new SomeService();someService.doSome();/*** 调用一个方法,一般涉及到4个要素:* ● 调用哪个对象的(someService)* ● 哪个方法(doSome)* ● 传什么参数(**)* ● 返回什么值(*)* 总结:调用哪个对象的哪个方法、传什么参数、返回什么值。** 即使使用反射机制调用方法,也需要具备上述4个要素*/String s1 = someService.doSome("张三");System.out.println(s1);String s2 = someService.doSome("李四", 180);System.out.println(s2);}
}
/*** 调用一个方法,一般涉及到4个要素:* ● 调用哪个对象的(someService)* ● 哪个方法(doSome)* ● 传什么参数(**)* ● 返回什么值(*)* 总结:调用哪个对象的哪个方法、传什么参数、返回什么值。** 即使使用反射机制调用方法,也需要具备上述4个要素*/
  • 使用反射机制调用方法

    • 代码:

package com.dong.reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Method;public class Test2 {public static void main(String[] args) throws Exception {//使用反射机制调用方法//先获取类Class<?> clazz = Class.forName("com.dong.reflect.SomeService");//获取方法Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);//调用方法//四要素:调用哪个对象、哪个方法、传什么参数、返回什么值。// obj 要素:哪个对象// doSomeMethod 要素:哪个方法// "李四身高:", 180 要素:传什么参数// retValue 要素:返回什么值Object obj = clazz.newInstance();/**          'newInstance()' 已弃用--->用以下方式创建对象:*         Constructor<?> con = clazz.getDeclaredConstructor();*         Object obj = con.newInstance();*/Object retValue = doSomeMethod.invoke(obj, "李四身高:", 180);System.out.println(retValue);}
}
    • 运行结果:

  • 小练习
    • 代码
package com.dong.reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Method;public class Test3 {public static void main(String[] args) throws Exception{//测试  用反射机制调用doSome()没有参数的方法//获取类Class<?> clazz = Class.forName("com.dong.reflect.SomeService");//获取方法Method doSomeMethod = clazz.getDeclaredMethod("doSome");//调用方法Constructor<?> con = clazz.getDeclaredConstructor();Object obj = con.newInstance();doSomeMethod.invoke(obj);}
}
  • 运行结果 


 10.4 假设你知道属性名

假设有这样一个类:

package com.dong.reflect;public class User {private String name;private int age;public User() {}public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

你知道以下这几条信息:

  • 类名是:com.powernode.reflect.User
  • 该类中有String类型的name属性和int类型的age属性。
  • 另外你也知道该类的设计符合javabean规范。(也就是说属性私有化,对外提供setter和getter方法)

你如何通过反射机制给User对象的name属性赋值zhangsan,给age属性赋值30岁。

  • 测试代码

v-1.0

package com.dong.reflect;import java.lang.reflect.Method;public class Test4 {public static void main(String[] args) throws Exception{/*需求:假设你现在知道一下信息:1、有这样一个类:类名叫:com.dong.reflect.User2、这个类符合JavaBean规范。属性私有化,对外提供公开的setter和getter方法3、你还知道这个类当中有一个属性,属性名叫:age4、并且你还知道age的属性类型为int类型请用反射机制调用相关方法,给user对象的age属性赋值*/String className="com.dong.reflect.User";String propertyName="age";//通过反射机制调用setAge(int)方法//获取类Class<?> clazz = Class.forName(className);//获取方法//先根据属性名获取方法名// [拼凑:set+属性先全部大写然后取第一个字母,即A+获取属性从第二个字母开始的全部字母,即:ge]=setAgeString setMethodName="set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);Method setMethod = clazz.getDeclaredMethod(setMethodName, int.class);//调用方法Object obj = clazz.newInstance();setMethod.invoke(obj, 30);System.out.println(obj);}
}

v-2.0  让属性类型动态获取---根据属性名获取属性类型

      //根据属性名获取属性类型---clazzField 是一个 Field 对象,它代表了 clazz 类中的名为 propertyName 的属性

Field clazzField = clazz.getDeclaredField(propertyName);//这段代码是通过反射机制获取一个类(clazz)中指定属性(propertyName)的Field对象(clazzField)。它使用了Java中的getDeclaredField方法,该方法可以获取类中声明的所有字段,包括私有字段。通过这段代码,可以动态地获取和操作类中的属性。Method setMethod = clazz.getDeclaredMethod(setMethodName,clazzField.getType());
package com.dong.reflect;import java.lang.reflect.Field;
import java.lang.reflect.Method;public class Test4 {public static void main(String[] args) throws Exception{/*需求:假设你现在知道一下信息:1、有这样一个类:类名叫:com.dong.reflect.User2、这个类符合JavaBean规范。属性私有化,对外提供公开的setter和getter方法3、你还知道这个类当中有一个属性,属性名叫:age4、并且你还知道age的属性类型为int类型请用反射机制调用相关方法,给user对象的age属性赋值*/String className="com.dong.reflect.User";String propertyName="age";//通过反射机制调用setAge(int)方法//获取类Class<?> clazz = Class.forName(className);//获取方法//先根据属性名获取方法名// [拼凑:set+属性先全部大写然后取第一个字母,即A+获取属性从第二个字母开始的全部字母,即:ge]=setAgeString setMethodName="set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);//根据属性名获取属性类型Field clazzField = clazz.getDeclaredField(propertyName);Method setMethod = clazz.getDeclaredMethod(setMethodName,clazzField.getType());//调用方法Object obj = clazz.newInstance();setMethod.invoke(obj, 30);System.out.println(obj);}
}
  • 运行结果

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

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

相关文章

【java爬虫】将优惠券数据存入数据库排序查询

本文是在之前两篇文章的基础上进行写作的 (1条消息) 【java爬虫】使用selenium爬取优惠券_haohulala的博客-CSDN博客 (1条消息) 【java爬虫】使用selenium获取某宝联盟淘口令_haohulala的博客-CSDN博客 前两篇文章介绍了如何获取优惠券的基础信息&#xff0c;本文将获取到的…

PyTorch 1.13简介

# 1.  PyTorch 1.13 据官方介绍&#xff0c;PyTorch 1.13 中包括了 BetterTransformer 的稳定版&#xff0c;且不再支持 CUDA 10.2 及 11.3&#xff0c;并完成了向 CUDA 11.6 及 11.7 的迁移。此外 Beta 版还增加了对 Apple M1 芯片及 functorch 的支持。 1.1 主要更新 Be…

C++第四讲

思维导图 仿照string类&#xff0c;实现myString类 /* ---------------------------------author&#xff1a;YoungZorncreated on 2023/7/19 19:20.--------------------------------- */ #include<iostream> #include<cstring>using namespace std;class myStri…

【数据结构】时间复杂度---OJ练习题

目录 &#x1f334;时间复杂度练习 &#x1f4cc;面试题--->消失的数字 题目描述 题目链接&#xff1a;面试题 17.04. 消失的数字 &#x1f334;解题思路 &#x1f4cc;思路1&#xff1a; malloc函数用法 &#x1f4cc;思路2&#xff1a; &#x1f4cc;思路3&…

如何使用DiskPart命令行格式化分区?

想要格式化磁盘分区&#xff0c;您可以使用磁盘管理工具&#xff0c;或在Windows文件资源管理器中右键单击驱动器并选择“格式化”。如果您更想使用命令行来格式化磁盘&#xff0c;那么Windows自带的DiskPart将是首选。 DiskPart有很多优点&#xff0c;例如&#xff0c;如果您想…

活动页服务端渲染探索

目标 通过采用在服务端渲染激励页的方式&#xff0c;降低页面加载白屏时间&#xff0c;从而提升激励 H5 渲染体验。 架构设计 前端服务框架调研选型 只对比分析以下两种方案&#xff1a; Vue3 Nuxt3 WebpackNext.js React Node.js ’Nuxt3Next.js介绍Nuxt是一个基于Vu…

Clickhouse基础和基本优化

CK基础和基本优化 一、ClickHouse的特点列式存储高吞吐写入能力数据分区与线程级并行表引擎的使用MergeTreeReplacingMergeTreeSummingMergeTree 二、SQL操作1.Insert2.Update 和 Delete3.查询操作4.alter操作5.导出数据 三、基于表的分布式集群集群写入流程&#xff08; 3分片…

旅游卡加盟代理合伙人模式软件开发

旅游卡加盟代理合伙人模式是近年来逐渐兴起的一种旅游产业发展模式&#xff0c;它通过将旅游卡加盟商与代理商紧密结合&#xff0c;实现资源共享、风险共担、合作共赢的目标。而软件开发作为旅游卡加盟代理合伙人模式的重要技术支持&#xff0c;对于该模式的实施和发展起着至关…

深入理解Java虚拟机(二)Java内存区域与内存溢出异常

一、前言 对于Java程序员来说&#xff0c;在虚拟机自动内存管理机制的帮助下&#xff0c;不再需要为每一个new操作去写配对的delete/free代码&#xff0c;不容易出现内存泄漏和内存溢出问题&#xff0c;看起来由虚拟机管理内存一切都很美好。不过&#xff0c;也正是因为Java程序…

iOS APP外包开发的语言比较

iOS APP是Apple公司运行在iPhone手机上的APP&#xff0c;开发这样的APP有两种开发语言可以选择&#xff0c;都是由Apple公司提供的语言。其中Objective-C使用时间相对较长&#xff0c;有历史兼容考虑&#xff0c;而Swift是新的开发语言&#xff0c;更符合近些年开发语言的发展理…

05 Docker 安装常用软件 (mongoDB)

目录 1. mongoDB简介 1.1 mongodb的优势 2. mongodb的安装 2.1 创建数据文件夹 2.2 备份日志 2.3 配置文件夹 2.4 创建两个文件 ---> 2.4.1 配置如下: 2.5 拉取mongodb 2.6 运行容器 2.7 进入mongodb容器 ---> 2.7.0 高版本(6.0)以上是这样的 , 旧版的没研究 …

服务保护 Sentinel

服务保护 Sentinel Sentinel 介绍Sentinel 的下载使用Sentinel 流控规则流控规则介绍流控规则演示 Sentinel 热点规则Sentinel 隔离和熔断降级Feign 整合 Sentinel线程隔离熔断降级 Sentinel 授权规则Sentinel 系统规则Sentinel 自定义异常Sentinel 资源定义url 默认资源抛出异…

【力扣周赛】第 354 场周赛

文章目录 Q1&#xff1a;6889. 特殊元素平方和思路——简单模拟题竞赛时代码 Q2&#xff1a;6929. 数组的最大美丽值思路——差分数组&#xff0c;计算每个数字可能出现的次数竞赛时代码解法2——排序 双指针⭐解法3——排序 二分查找 Q3&#xff1a;6927. 合法分割的最小下标…

Linux 漏洞扫描

Linux 漏洞扫描程序会仔细检查基于 Linux 的系统&#xff0c;以减轻潜在的风险和漏洞。 什么是 Linux 漏洞扫描程序 Linux 漏洞扫描程序是一种专门的漏洞扫描工具&#xff0c;旨在识别基于 Linux 的系统中的安全漏洞和弱点,它会扫描配置错误、过时的软件版本和已知漏洞。 为…

pytorch学习--第一个模型(线性模型)

目标 我们想通过随机初始化的参数 ω , b \omega ,b ω,b能在迭代过程中使预测值和目标值能无限接近 y ω x b y\omega xb yωxb 定义数据 x torch.rand([60, 1])*10 y x*2 torch.randn(60,1)构建模型 利用pytorch中的nn.Module 想要构建模型时&#xff0c;继承这个类…

(四)「消息队列」之 RabbitMQ 路由(使用 .NET 客户端)

0、引言 先决条件 本教程假设 RabbitMQ 已安装并且正在 本地主机 的标准端口&#xff08;5672&#xff09;上运行。如果您使用了不同的主机、端口或凭证&#xff0c;则要求调整连接设置。 获取帮助 如果您在阅读本教程时遇到问题&#xff0c;可以通过邮件列表或者 RabbitMQ 社区…

Meta发布升级大模型LLaMA 2:开源可商用

论文地址&#xff1a;https://ai.meta.com/research/publications/llama-2-open-foundation-and-fine-tuned-chat-models/ Github地址&#xff1a;https://github.com/facebookresearch/llama LLaMA 2介绍 Meta之前发布自了半开源的大模型LLaMA&#xff0c;自从LLaMA发布以来…

C# WPF实现动画渐入暗黑明亮主题切换效果

C# WPF实现动画渐入暗黑明亮主题切换效果 效果图如下最近在Bilibili的桌面端看到一个黑白主题切换的效果感觉&#xff0c;挺有意思。于是我使用WPF尝试实现该效果。 主要的切换效果&#xff0c;基本实现不过还存在一些小瑕疵&#xff0c;比如字体等笔刷不能跟随动画进入进行切…

Docker简介

Docker简介 文章目录 Docker简介一、Docker1.什么是docker?2.容器引擎3.容器和虚拟机的区别4.namespace&#xff08;命名空间&#xff09;5.三大容器核心概念镜像容器仓库 二、Docker镜像操作1.搜索镜像2.获取镜像镜像加速下载 3.查看本地下载镜像4.获取镜像详细信息5.为本地镜…

SQL 上升的温度

197 上升的温度 SQL架构 表&#xff1a; Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是这个表的主键 该表包含特定日期的温度信息 编写一个 SQL …