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;本文将获取到的…

Make:默认构建目标(终极目标)

相关文章 Make&#xff1a;目标&#xff08;Target&#xff09;构建的详细和依赖项的处理过程&#xff08;个人总结&#xff09; 默认情况下make命令的构建从第一个没有 . 前缀的目标&#xff08;target&#xff09;开始&#xff08;除非有 . 前缀的目标中有一个或更多 / &…

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…

php运算符的基本使用

$base 20; $height 10; $area $base * $height; 我用来将base与height相乘的* &#xff0c;就是乘法运算。 我们有相当多的运算符&#xff0c;让我们对主要的运算符做一个简单的总结。 首先&#xff0c;这里是算术运算符。,-,*,/ &#xff08;除法&#xff09;,% &#x…

C++第四讲

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

【Windows】查找占用端口的进程、结束进程

记录一下在windows环境下通过命令行窗口进行进程有关的几个操作。 1、查找占用端口的进程ID(PID)&#xff1a; netstat -ano|findstr 28087 假如PID为21812、根据PID找进程名称&#xff1a; tasklist | findstr 2181 发现是占用28087端口的进程为&#xff1a;java.exe。 3、…

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

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

LeetCode(字节10日)-0714

648. 单词替换(中等) 思路&#xff1a;前缀树匹配 // 思路&#xff1a;前缀树匹配&#xff0c;成功返回前缀&#xff0c;失败返回 null&#xff0c;保留原来单词值 // 多个词根时使用最短词根&#xff0c;不需要 fail 指针 // string 处理使用 stringBuilder&#xff0c;避…

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

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

最短Hamilton路径

题目 给定一张 n 个点的带权无向图&#xff0c;点从 0∼n−1 标号&#xff0c;求起点 0 到终点 n−1 的最短 Hamilton 路径。 Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。 输入格式 第一行输入整数 n。 接下来 n 行每行 n 个整数&#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程序…

SQLite和SDK基本概念

SQLite是一种轻量级的关系型数据库管理系统 (RDBMS)&#xff0c;它以文件形式存储数据&#xff0c;不需要独立的服务器进程&#xff0c;可以直接集成到应用程序中使用。SQLite的设计目标是提供一种简单、快速、可靠的数据库解决方案&#xff0c;适用于各种规模的应用程序和设备…

iOS APP外包开发的语言比较

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

Vue单页面实现el-tree el-breadcrumb功能、el-tree右键点击树节点展示菜单功能、树节点编辑节点字段名称功能

(1) 点击el-tree节点 使用el-breadcrumb展示选中树节点及父项数据 重点&#xff1a;handleNodeClick方法、getTreeNode方法 (2) 选择el-breadcrumb-item设置el-tree节点选中 必须设置属性: current-node-key"currentNodeKey" 、 node-key"id" 重点: 设置…

如何应对.kann勒索病毒:恢复数据的有效策略

导言&#xff1a; 随着科技的发展和互联网的普及&#xff0c;网络安全问题越来越受到人们的关注。而在网络安全领域&#xff0c;勒索病毒是一类极具破坏力的恶意软件。其中&#xff0c; .kann 勒索病毒是近期出现的一种恶意软件变种。91数据恢复本文将介绍什么是 .kann 勒索病毒…

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)以上是这样的 , 旧版的没研究 …

C++的虚函数与纯虚函数

C的虚函数是一种特殊的成员函数&#xff0c;用于实现多态性。虚函数允许在基类中声明一个函数&#xff0c;在派生类中根据需要进行重写&#xff0c;并通过基类指针或引用来调用派生类对象的特定实现。 ①虚函数的声明 ②多态性 ③派生类重写虚函数 ④纯虚函数 ⑤注意 ①虚…