【Java基础】聊聊你不知道反射的那些事

在编程语言中,反射是一个绕不过的一个话题,反射、注解、动态代理是支撑框架运行的核心技术。
在Spring中,IOC利用反射实现,创建对象。AOP利用动态代理实现,实现切面编程,配置利用注解实现。所以继上一篇,注解,本篇来讲解一下反射。

反射的作用

创建对象
在刚开始学习java的时候,都是直接new对象,但是进入web编程的之后,发现不需要使用自己new对象了,直接在注解上@Bean 就可以在框架运行时进行创建对象,其实就是利用反射创建对象。
new的方式创建对象,其创建对象的需求是在代码编写时确定的,而通过反射来创建对象,是在运行时期来确定的。

执行方法
除了在运行时期动态创建对象,还可以在运行时期动态执行方法,通过 new的方式 只能在编译期确定。这种就需要反射。

获取类信息
通过反射还可以动态获取类的信息,方法,属性等。

用法

Class
Class是一个类,存储的是类的信息,Class提供了大量的方法,可以获取类的信息,比如获取类中的方法,构造函数等。
在这里插入图片描述

        // 创建Class对象 方式1Class<?> clazz = Class.forName("com.fanshe.FanSheDemo");// 方式2Class<FanSheDemo> sheDemoClass = FanSheDemo.class;// 方式3FanSheDemo fanSheDemo = new FanSheDemo();Class<? extends FanSheDemo> fanSheDemoClass = fanSheDemo.getClass();

当然出了Class、还有Constructor、Method、Field等常用方法。

应用

在平时的开发中,如果我们使用工厂模式,其实可以发现工厂模式中都是直接写死在代码中的。但是对于一个通用型的框架来说,必须高度解耦合。SpringIOC的容器流程就是如下,通过配置文件定义要创建的对象,然后解析成BeanDefition,利用反射创建对象,存储Map中。
在这里插入图片描述
从整体代码上看,其实就是通过将对象信息存入BeanDefinitions中,然后创建对象,通过反射的方式,将对象存入到map中。
在这里插入图片描述

原理

{    long star = System.currentTimeMillis();for (int i = 0; i < 10000000; i++) {C c = new C();c.f();}System.out.println("new:"+(System.currentTimeMillis() - star));long star2 = System.currentTimeMillis();for (int i = 0; i < 10000000; i++) {Class<C> cClass = C.class;C c = cClass.newInstance();c.f();}System.out.println(System.currentTimeMillis() - star2);}public static class C {public void f() {}}

通过上述代码,可以看到其实反射比new的方式要慢,主要在于反射这种方式多了安全性检查和类,方法的查找。具体这里就不详细描述感兴趣的可以自行查阅相关资料。

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

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

相关文章

代码随想录算法训练营第32天 | 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II

买卖股票的最佳时机II 贪心思路 要想使用贪心算法解决此问题&#xff0c;意识到利润是可分解的很关键。比如[1,2,3,4,5]这个输入&#xff0c;最大利润为第一天买入&#xff0c;第五天卖出。这等效于第一天买入&#xff0c;第二天卖出&#xff0c;第二天再买入。。。 prices[4]…

HCS-华为云Stack-FusionSphere

HCS-华为云Stack-FusionSphere FusionSphere是华为面向多行业客户推出的云操作系统解决方案。 FusionSphere基于开放的OpenStack架构&#xff0c;并针对企业云计算数据中心场景进行设计和优化&#xff0c;提供了强大的虚拟化功能和资源池管理能力、丰富的云基础服务组件和工具…

MYSQL基本查询(CURD:创建、读取、更新、删除)

文章目录 前言一、Create1.全列插入2.指定列插入3.插入否则更新4.替换 二、Retrieve1.SELECT列2.WHERE条件3.结果排序4.筛选分页结果 三、Update四、Delete1.删除数据2.截断表 五、插入查询结果六、聚合函数 前言 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型…

kali系统入侵电脑windows(win11系统)渗透测试,骇入电脑教学

本次渗透测试将使用kali虚拟机&#xff08;攻击机&#xff09;对本机&#xff08;靶机&#xff09;进行入侵并监控屏幕 声明&#xff1a;本篇仅仅是将本机作为靶机的一次简易渗透测试&#xff0c;实际情况中基本不可能出现如此简单的木马骇入&#xff08;往往在上传木马时就被防…

Android App开发-简单控件(4)——按钮触控和图像显示

3.4 按钮触控 本节介绍了按钮控件的常见用法&#xff0c;包括&#xff1a;如何设置大小写属性与点击属性&#xff0c;如何响应按钮的点击事件和长按事件&#xff0c;如何禁用按钮又该如何启用按钮&#xff0c;等等。 3.4.1 按钮控件Button 除了文本视图之外&#xff0c;按钮…

clickhouse 安装与入门(单节点安装)

1、简介 Clickhouse 是一个开源的面向联机分析处理&#xff08;OLAP, On-Line Analytical Processing&#xff09;的列式存储数据库管理系统。写入快、查询快&#xff0c;支持sql向量化、并行和分布式查询&#xff1b;但是不支持事务&#xff0c;不支持二级索引等。由俄罗斯的Y…

5_机械臂运动学基础_矩阵

上次说的向量空间是为矩阵服务的。 1、学科回顾 从科技实践中来的数学问题无非分为两类&#xff1a;一类是线性问题&#xff0c;一类是非线性问题。线性问题是研究最久、理论最完善的&#xff1b;而非线性问题则可以在一定基础上转化为线性问题求解。 线性变换&#xff1a; 数域…

【jetson笔记】解决vscode远程调试qt.qpa.xcb: could not connect to display报错

配置x11转发 jetson远程安装x11转发 安装Xming Xming下载 安装完成后打开安装目录C:\Program Files (x86)\Xming 用记事本打开X0.hosts文件&#xff0c;添加jetson IP地址 后续IP改变需要重新修改配置文件 localhost 192.168.107.57打开Xlaunch Win菜单搜索Xlaundch打开 一…

openssl3.2 - 测试程序的学习 - test\acvp_test.c

文章目录 openssl3.2 - 测试程序的学习 - test\acvp_test.c概述笔记要单步学习的测试函数备注END openssl3.2 - 测试程序的学习 - test\acvp_test.c 概述 openssl3.2 - 测试程序的学习 将test*.c 收集起来后, 就不准备看makefile和make test的日志参考了. 按照收集的.c, 按照…

【java面试】常见问题(超详细)

目录 一、java常见问题JDK和JRE的区别是什么&#xff1f;Java中的String类是可变的还是不可变的&#xff1f;Java中的equals方法和hashCode方法有什么关系&#xff1f;Java中什么是重载【Overloading】&#xff1f;什么是覆盖【Overriding】&#xff1f;它们有什么区别&#xf…

【计算机网络】概述|分层体系结构|OSI参考模型|TCP/IP参考模型|网络协议、层次、接口

目录 一、思维导图 二、计算机网络概述 1.计算机网络定义、组成、功能 2.计算机网络分类 3.计算机网络发展历史 &#xff08;1&#xff09;计算机网络发展历史1&#xff1a;ARPANET->互联网 &#xff08;2&#xff09;计算机网络发展历史2&#xff1a;三级结构因特网 …

【JavaWeb】日程管理系统 添加过滤器登录校验 第三期

文章目录 过滤器控制登录校验创建过滤器类修改login原业务方法 总结 过滤器控制登录校验 未添加过滤器 可以直接访问 showShedule.html 需求说明: 未登录状态下不允许访问showShedule.html和SysScheduleController相关增删改处理,重定向到login.html,登录成功后可以自由访问 创…

RabbitMQ进阶篇【理解➕应用】

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于RabbitMQ的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一.什么是交换机 1.概念释义 2.例…

web前端-------伪类和伪元素

但是&#xff0c;网页中一些特殊的样式&#xff0c;需要用到特殊的CSS选择器来设置。&#xfeff;在CSS中&#xff0c;我们把这类选择器称为伪选择器。 伪选择器&#xff0c;分为伪类选择&#xfeff;器和伪元素选择器两个大类。 伪类选择器&#xff0c;简称伪类&#xff1b;…

【贪吃蛇:C语言实现】

文章目录 前言1.了解Win32API相关知识1.1什么是Win32API1.2设置控制台的大小、名称1.3控制台上的光标1.4 GetStdHandle&#xff08;获得控制台信息&#xff09;1.5 SetConsoleCursorPosition&#xff08;设置光标位置&#xff09;1.6 GetConsoleCursorInfo&#xff08;获得光标…

【DeepLearning-8】MobileViT模块配置

完整代码&#xff1a; import torch import torch.nn as nn from einops import rearrange def conv_1x1_bn(inp, oup):return nn.Sequential(nn.Conv2d(inp, oup, 1, 1, 0, biasFalse),nn.BatchNorm2d(oup),nn.SiLU()) def conv_nxn_bn(inp, oup, kernal_size3, stride1):re…

接口测试入门,如何划分接口文档

1.首先最主要的就是要分析接口测试文档&#xff0c;每一个公司的测试文档都是不一样的。具体的就要根据自己公司的接口而定&#xff0c;里面缺少的内容自己需要与开发进行确认。 我认为一针对于测试而言的主要的接口测试文档应该包含的内容分为以下几个方面。 a.具体的一个业…

一文深度解读多模态大模型视频检索技术的实现与使用

当视频检索叠上大模型Buff。 万乐乐&#xff5c;技术作者 视频检索&#xff0c;俗称“找片儿”&#xff0c;即通过输入一段文本&#xff0c;找出最符合该文本描述的视频。 随着视频社会化趋势以及各类视频平台的快速兴起与发展&#xff0c;「视频检索」越来越成为用户和视频平…

JVM/GC复习

JVM/GC JVM(java虚拟机)MATjstack(将正在运行的JVM的线程进行快照并且打印出来)死锁VisualVM工具(监控线程内存使用情况)JMX分析堆日志什么情况下可能需要JVM调优补充JVM内部结构JVM 调优策略(补充) GC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法…

NQA测试机制—UDP Jitter测试

概念 UDP Jitter是以UDP报文为承载&#xff0c;通过记录在报文中的时间戳信息来统计时延、抖动、丢包的一种测试方法。Jitter&#xff08;抖动时间&#xff09;是指相邻两个报文的接收时间间隔减去这两个报文的发送时间间隔。 UDP Jitter测试的过程如下&#xff1a; 1. 源端&a…