反射知识总结
狂神说
反射的功能:
类加载内存分析
类加载的时候,class对象就形成了。
类无论有多少对象,class对象只有一个。
获取类对象三种方式
反射,就是通过api获取一个类的类对象:
有三种方式:
方法一:
基本不用,因为依赖于对象,必须要new一个对象才可以使用,前面new了才可以使用。
Getclass()方法是object类里的方法,返回一个对象的运行时类对象,返回值类型为Class。
方式二:
开发中用的最多
格式:类名.class 就可以获得内存中的类对象了。
方法三:
配置文件中,很多框架中使用
格式:Class.forName(“类的信息(包名+类名)”),返回值的类型是Class类。
这句话会导致类加载器加载并生成类对象,就是内存中还没有对象的生成时用,所以叫编译阶段使用的。
创建对象
举例代码:
类对象有了,就可以通过类对象创建对象了
理解:类的信息都在类对象里,当然可以创建对象了。
以方法二的c2示例:
方法的返回值是泛型:
所以找不到任何类型,会造成类型丢失,所以要强制转换。
但是开发中尽量不要强制类型转换,那如何让他知道这里是person类型:
把具体的类型给他:
Class后面加上,这样就可以找到具体类型了,不用(Person)强制转换了,如下:
所以不要随便用强制类型转换。
因为创建对象过程中一定会调构造器,这里通过实验,发现newInstance()方法会调空的构造器,把空的注释掉,发现会报错。
所以结论:
创建对象过程中一定会默认调用空构造器,如果框架用了反射,会调用空的构造器,所以到时候一定要注意空构造器的存在(加了其他构造器了却没补空构造器)。
用面向对象的思想去描述内存中类的相关信息:(自己手写)
自己写
一个类由属性,构造器,方法等等组成。
MyClass类专门描述这个类对象各个信息,然后有方法供外界获得所描述的类的信息:属性,构造器,方法,接口,父类等。
这里示例用的数组,用可变数组,集合都可以。
MyModify类描述所有的修饰符:final,static,权限修饰符 :1表示public,2表示……,然后该属性用了哪些就把数字填在MyFiled类里的MyModify数组里。
MyFiled类专门描述每个类的属性:一个类的属性由修饰符,类型,属性名,值构成。
MyConStruct类专门描述每个类的构造器:通过形参区分每一个构造器
不示例了。
MyMethod类专门描述每个类的方法:方法由修饰符,方法名字。
让方法执行:
静态方法:类名.方法名(参数)
非静态方法:对象.方法名(参数),参数不同执行不同的方法。
所以需要:对象,方法名,参数。
Add.invoke(对象,参数)这是什么东西老师说他昨天下午讲的那个。
方法描述没看懂。
jdk写的
Java把我们刚刚做的事起了个名字叫:java的反射机制
在运行的环境中(内存或虚拟机中),对于任意一个类,都要获得它的属性和方法,sun公司提供:
查看他们的源码和我们写的对比:看一下描述属性和权限修饰符的(Fied),简单一点可以看,可以发现和我们自己写的差不多。权限修饰符的:用了枚举值
自己IDEA看源码。
获得类所有的属性
获得指定属性:
获得指定的值,注意:私有化属性会失败,下面注释掉1的,就是私有化运行会报错。
需要要在person类里加一个toString方法:
私有化的处理:打破封装:
获得构造器
获得多个构造器:
Person类中的构造器
获得具体构造器:比如第二个构造器
因为不知道构造器参数是几个,所以要用可变数组
获得方法
会把父类的也都获得:
获得指定方法:
方法的执行:
获得父类
输出:
获得接口
反射使用场景
场景一:工厂模式中简单工厂模式优化
场景二:代理模式中动态代理应用及Aop实现
场景三:Java中 JDBC连接数据库,JDBC 中,利用反射动态加载了数据库驱动程序。jdbc注册驱动。
场景四:Spring 通过 xml 文件生成 bean 对象并给属性赋值。Java的反射机制在做基础框架的时候非常有用,有一句话这么说来着:反射机制是很多Java框架的基石。而一般应用层面很少用,不过这种东西,现在很多开源框架基本都已经给你封装好了,自己基本用不着写。Spring用到很多反射机制。经典的就是在xml文件或者properties里面写好了配置,然后在Java类里面解析xml或properties里面的内容,得到一个字符串,然后用反射机制,根据这个字符串获得某个类的Class实例,这样就可以动态配置一些东西,不用每一次都要在代码里面去new或者做其他的事情,以后要改的话直接改配置文件,代码维护起来就很方便了,同时有时候要适应某些需求,Java类里面不一定能直接调用另外的方法,这时候也可以通过反射机制来实现。
总的来说,自己写的很少,具体什么时候要用那要看需求,反射机制无非就是根据一个String来得到你要的实体对象,然后调用它原来的东西。但是如果是要自己写框架的话,那就会用得比较多了。
能具体说个场景吗,比如你以jdbc举例吧?
Class.forname()会使类加载器加载.class文件,生成类对象,并且默认初始化,初始化就会执行static代码块中的内容会在类初始化的时候执行。那么会自动执行static代码块中的内容。
类运行三个步骤详细理解:(理解就行)
装载:生成class类对象在这个阶段
连接:
初始化:
最后还有个:
实例化阶段(第三阶段第一条中的内容):创建对象
总结:
一句new,就会把类加载器加载.class文件,然后类运行全部步骤都做了。
但是不一定全部都要第四步创建对象阶段,比如:
只调用静态的东西不会执行创建对象阶段,class,.forname指定不要初始化就不会执行初始化和执行对象阶段
也不一定后面的执行了,前面的阶段都要再执行一遍:
但是创建对象时候,如果之前初始化过了,那么初始化及之前那些阶段也都不会执行
!!执行阶段汇总
静态代码块:类加载的时候就会执行
注意:前面两个没有静态方法!!
总结:
(配合static,代码块,构造方法绿色的部分,我的java笔记)
静态的东西在初始化阶段按照书写顺序执行(先父类里写顺序执行,再子类里写顺序执行),一旦初始化阶段执行过了,再怎么创建对象都不会再初始化阶段。
普通代码块,构造方法在创建对象时候自动执行
哪些类型可以有class对象
代码证明:
输出结果:
反射使用配置文件创建对象举例说明
https://www.bilibili.com/video/BV1Rf4y1h7yq/?spm_id_from=333.788.recommend_more_video.-1&vd_source=05a3c1275b87b47507d869e9349ee3cd
之前我们创建对象,new的时候写代码的时候就知道创建的对象是谁:
反射就是:
写代码时候,单纯看java代码都不知道对象是谁。
所以我们要借助配置文件,把我们要创建对象的信息放进配置文件里。让java读取配置文件就可以。这样就可以做到,编写和编译的时候不知道对象是是谁:
举例:
因为:运行的时候才能读取配置文件,才知道要创建谁,才能去创建对象。
首先:建一个配置文件,这里用.properties配置文件
然后:
读取并解析配置文件:
然后获取值,通过反射创建对象:
获取泛型信息
相关文章:
反射知识总结
狂神说 反射的功能: 类加载内存分析 类加载的时候,class对象就形成了。 类无论有多少对象,class对象只有一个。 获取类对象三种方式 反射,就是通过api获取一个类的类对象: 有三种方式: 方法一…...
selenium部署分布式 UI 自动化测试环境-Docker
一、根据selenium/hub官网的配置信息,进行配置。 How to run this image The Hub and Nodes will be created in the same network and they will recognize each other by their container name. A Docker network needs to be created as a first step.Create …...
算法刷题Day5: BM52 数组中只出现一次的两个数字
描述: 一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 要求:空间复杂度 O(1),时间复杂度O(n)。 题目传送门 is here 思路: 方法一:最简单的思路就…...
使用docker-compose部署搜索引擎ElasticSearch6.8.10
背景 Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索,并提供了强大的聚合功能,可以处理大规模的数据集并进行快速…...
多线程篇-5--线程分类(线程类型,springboot中常见线程类型,异步任务线程)
常见的线程类型包括用户线程(User Threads)、守护线程(Daemon Threads)、主线程(Main Thread)、工作线程(Worker Threads)和线程池中的线程。 一、用户线程(User Thread…...
详解高斯消元
详解高斯消元 好东西,可以求所有一次方程组的解。 \color {red} 好东西,可以求所有一次方程组的解。 好东西,可以求所有一次方程组的解。 前置知识 一般消元法的公理: 两方程互换,解不变; 一方程乘以非零数 k k k,解不变; 一方程乘以数 k k k加上另一方程,解不变。 …...
【Python网络爬虫笔记】5-(Request 带参数的get请求) 爬取豆瓣电影排行信息
目录 1.抓包工具查看网站信息2.代码实现3.运行结果 1.抓包工具查看网站信息 请求路径 url:https://movie.douban.com/typerank请求参数 页面往下拉,出现新的请求结果,参数start更新,每次刷新出20条新的电影数据 2.代码实现 # 使用网络爬…...
泷羽sec- shell编程(8) until循环以及函数基本创建调用 学习笔记
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
Apache Flink从Kafka中消费商品数据,并进行商品分类的数量统计题
使用Apache Flink从Kafka中消费商品数据,并进行商品分类的数量统计是一个典型的流处理任务。以下是一个详细的步骤指南和示例代码,帮助你实现这一功能。 ### 前提条件 1. **安装Flink**:确保你的环境中已经安装了 Apache Flink。 2. **安装…...
Ubuntu 安装 MariaDB
安装 MariaDB具体步骤 1、更新软件包索引: sudo apt update2、安装 MariaDB 服务器: sudo apt install mariadb-server3、启动 MariaDB 服务(如果未自动启动): sudo systemctl start mariadb4、设置 MariaDB 开机启…...
GPT打字机效果—— fetchEventSouce进行sse流式请求
EventStream基本用法 与 WebSocket 不同的是,服务器发送事件是单向的。数据消息只能从服务端到发送到客户端(如用户的浏览器)。这使其成为不需要从客户端往服务器发送消息的情况下的最佳选择。 const evtSource new EventSource(“/api/v1/…...
Leetcode 3373. Maximize the Number of Target Nodes After Connecting Trees II
Leetcode 3373. Maximize the Number of Target Nodes After Connecting Trees II 1. 接替思路2. 代码实现 题目链接:3373. Maximize the Number of Target Nodes After Connecting Trees II 1. 接替思路 这一题和前一题Leetcode 3372其实整体思路上并没有啥太大…...
JS的魔法三角:constructor、prototype与__proto__
在JavaScript中,constructor、prototype和__proto__是与对象创建和继承机制紧密相关的三个概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个魔法三角: 1. constructor 定义:constructor是一个函数&am…...
用c语言完成俄罗斯方块小游戏
用c语言完成俄罗斯方块小游戏 这估计是你在编程学习过程中的第一个小游戏开发,怎么说呢,在这里只针对刚学程序设计的学生,就是说刚接触C语言没多久,有一点功底的学生看看,简陋的代码,简陋的实现࿰…...
Leetcode打卡:N皇后
执行结果:通过 题目:51 N皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#…...
位运算在嵌入式系统开发中的应用
目录 一、数据存储与节省 “绝技” 1.1. 传感器数据存储挑战 1.2. 位运算解决方案 1.2.1. 数据整合 1.2.2. 数据提取 1.3. 收益分析 二、硬件控制 “精准操纵术” 2.1. 位运算操控硬件寄存器的实例 2.2. 位运算在硬件控制中的优势 2.3. 电机驱动芯片寄存器控制示例 …...
livekit 服务部署
本地起 1. 拉取生成文件镜像 sudo docker pull livekit/generate 2. 生成配置文件 sudo docker run --rm -v $PWD:/output livekit/generate --local (记住输出信息) 3. 拉取livekit/livekit-server sudo docker pull livekit/livekit-server 4. 开始运行服务 sudo docker run…...
笔记:visual studio2022编译 和 运行 VTK9.4.0
一、下载源码 VTK官网下载对应源码。 Download | VTKhttps://vtk.org/download/ 二、编译动态库(基于Win11 24h) 1. 用VS打开VTK源码的CMakeLists.txt,等待项目配置完成。 生成完毕如图 2.生成动态库,点击全部生成,…...
【Linux | 计网】TCP协议深度解析:从连接管理到流量控制与滑动窗口
目录 前言: 1、三次握手和四次挥手的联系: 为什么挥手必须要将ACK和FIN分开呢? 2.理解 CLOSE_WAIT 状态 CLOSE_WAIT状态的特点 3.FIN_WAIT状态讲解 3.1、FIN_WAIT_1状态 3.2、FIN_WAIT_2状态 3.3、FIN_WAIT状态的作用与意义 4.理解…...
Qt Sensors 传感器控制介绍篇
文章目录 Qt Sensors 模块介绍前言 什么是 Qt Sensors?主要特点: 支持的传感器类型Qt Sensors 的核心组件应用场景优势总结 Qt Sensors 模块介绍 前言 随着现代硬件设备的不断发展,传感器已成为许多设备(如智能手机、平板电脑和…...
探索3D世界:使用 lib3ds 读取和解析 3DS 文件
在3D图形开发中,读取和解析3DS文件是创建和渲染3D场景的第一步。3DS(3D Studio)文件格式是一种广泛使用的3D模型文件格式,它包含了多种类型的数据,用于描述3D场景中的物体、材质、相机、灯光和动画等。lib3ds 是一个开…...
【开源免费】基于SpringBoot+Vue.JS服装生产管理系统(JAVA毕业设计)
博主说明:本文项目编号 T 066 ,文末自助获取源码 \color{red}{T066,文末自助获取源码} T066,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...
计算机技术:冯·诺伊曼架构
冯诺伊曼架构(Von Neumann Architecture)是由著名数学家和计算机科学家约翰冯诺伊曼(John von Neumann)在20世纪40年代提出的一种计算机设计模型。它奠定了现代通用计算机设计的基础。 1. 核心思想 冯诺伊曼架构的核心思想是存储…...
在Window10或11系统中同时安装 JDK8 和 JDK11
在Window10或11系统中同时安装 JDK8 和 JDK11 最近写项目,之前的项目是用Java8环境开发的,在二次迭代中,但是新开发的项目采用Java11环境来开发,所以需要同时安装JDK8和JDK11环境,但是两个环境是不能同时使用的&#…...
Hbase2.2.7集群部署
环境说明 准备三台服务器,分别为:bigdata141(作为Hbase主节点)、bigdata142、bigdata143确保hadoop和zookeeper集群都先启动好我这边的hadoop版本为3.2.0,zookeeper版本为3.5.8 下载安装包 下载链接:In…...
Java学习,数据结构
Java 提供了丰富的数据结构来处理和组织数据,Java的 java.util 包中提供了许多这些数据结构的实现,可以根据需要选择合适的类。 List(列表) ArrayList:基于动态数组的数据结构,允许包含重复元素和 null。 …...
微众银行前端面试题及参考答案
使用的协议是 HTTP 还是 HTTPS,为什么没用 HTTPS? 在前端开发中,有些网站使用 HTTP 协议,有些使用 HTTPS 协议。 使用 HTTP 协议的情况可能是因为网站对安全性的要求不是极高,或者处于开发的早期阶段,还没有…...
spark同步mysql数据到sqlserver
使用Apache Spark将数据从MySQL同步到SQL Server是一个常见的ETL(Extract, Transform, Load)任务。这里提供一个基本的步骤指南,以及一些代码示例来帮助你完成这项工作。 ### 前提条件 1. **安装Spark**:确保你的环境中已经安装了…...
使用 useMemo 和 React.memo 优化 React 组件渲染
在 React 中,性能优化是一个重要的主题,特别是在复杂的组件树中。本文将演示如何在同一个父组件中使用 useMemo 和 React.memo 来优化子组件的渲染。 1. 组件结构 创建一个父组件,包含两个子组件: MemoChild:使用 R…...
像素流送api ue多人访问需要什么显卡服务器
关于像素流送UE推流,在之前的文章里其实小芹和大家聊过很多,不过今天偶然搜索发现还是有很多小伙伴,在搜索像素流送相关的问题,搜索引擎给的提示有这些。当然这些都是比较短的词汇,可能每个人真正遇到的问题和想获取的…...
Bert+CRF的NER实战
CRF(条件随机场-Conditional Random Field) 原始本文:我在北京吃炸酱面 标注示例: 我O在O北B-PLA京I-PLA吃O炸B-FOOD酱I-FOOD面I-FOOD CRF: 目的:提出一些不可能出现的预测组合(例如I-PLA不能…...
python学习笔记8-函数2
参数传递 传不可变对象 & 传可变对象 def func(b):print(id(a), a) #140737041872600 234print(id(b), b) #140737041872600 234a 234 func(a)def func(b):print(id(a), a) #1413554098560 [343]print(id(b), b) #1413554098560 [343]a [343] func(a)def func(b):b.appe…...
【linux学习指南】详解Linux进程信号保存
文章目录 📝保存信号🌠 信号其他相关常⻅概念🌉在内核中的表⽰ 🌠 sigset_t🌠信号集操作函数🌉sigprocmask🌉sigpending 🚩总结 📝保存信号 🌠 信号其他相关常…...
Postman设置接口关联,实现参数化
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果, 从而让后一个接口能正常执行,这…...
ORACLE之DBA常用数据库查询
数据库信息 数据库概要select a.name "DB Name", e.global_name "Global Name", c.host_name "Host Name", c.instance_name "Instance Name" , DECODE(c.logins,RESTRICTED,YES,NO) "Restricted Mo…...
C++之C++11新特性(三)--- 智能指针
目录 一、智能指针 1.1 为什么需要智能指针 1.2 内存泄漏 1.2.1 内存泄漏的基本概念 1.2.2 内存泄漏的分类 1.2.3 如何避免内存泄漏 1.3 智能指针的使用及其原理 1.3.1 RAII 1.3.2 智能指针的基本原理 1.3.3 auto_ptr 1.3.4 unique_ptr 1.3.5 shared_ptr 1.3.6 sha…...
12 设计模式之工厂方法模式
一、什么是工厂方法模式? 1.定义 在软件开发中,设计模式 是解决常见软件设计问题的最佳实践。而 工厂方法模式(Factory Method Pattern) 作为创建型设计模式之一,常常被用来解决对象创建问题。它通过将对象的创建交给…...
Python 自动化办公的 10 大脚本
大家好,我是你们的 Python 讲师!今天我们将讨论 10 个实用的 Python 自动化办公脚本。这些脚本可以帮助你简化日常工作,提高效率。无论是处理 Excel 文件、发送邮件,还是自动化网页操作,Python 都能派上用场。 1. 批量…...
十一、快速入门go语言之接口和反射
文章目录 接口:one: 接口基础:two: 接口类型断言和空接口:star2: 空接口实现存储不同数据类型的切片/数组:star2: 复制切片到空接口切片:star2: 类型断言 反射 📅 2024年5月9日 📦 使用版本为1.21.5 接口 十、Java类的封装和继承、多态 - 七点半的菜市…...
Python中字符串和正则表达式
Python中字符串和正则表达式 在Python编程中,字符串是最常用的数据类型之一。字符串用于表示文本数据,而正则表达式则是一种强大的工具,用于处理和匹配字符串中的模式。本文将介绍Python中的字符串操作、字符串格式化以及如何使用正则表达式…...
力扣刷题TOP101:8.BM10 两个链表的第一个公共结点
目录: 目的 思路 复杂度 记忆秘诀 python代码 目的 两个无环的单向链表,它们的第一个公共结点{{6,7}。 思路 这个任务是找到两个链表的第一个公共结点。可以看作两个心机boy偷偷补课翻车事件。平时嘴上说自己在家玩游戏,实际上背地里都偷…...
⽂件操作详解
⽬录 一 文件操作的引入 1 为什么使⽤⽂件? 2 什么是⽂件? 3 文件分类(1 从⽂件功能的⻆度来分类:程序⽂件/数据⽂件 2根据数据的组织形式:为⽂本⽂件/⼆进制⽂件) 二 ⽂件的打开和关闭 1 …...
UR开始打中国牌,重磅发布国产化协作机器人UR7e 和 UR12e
近日,优傲(UR)机器人公司立足中国市场需求,重磅推出UR7e和UR12e 两款本地化协作机器人。它们延续优傲(UR)一以贯之的高品质与性能特质,着重优化负载自重比,且在价格层面具竞争力&…...
PostgreSQL实现透视表查询
PostgreSQL 8.3版本发布时,引入了一个名为tablefunc的新扩展。这个扩展提供了一组非常有趣的函数。其中之一是交叉表函数,用于创建数据透视表。这就是我们将在本文中讨论的内容。 需求说明 解释此函数如何工作的最简单方法是使用带有数据透视表的示例…...
C#里怎么样使用Array.BinarySearch函数?
C#里怎么样使用Array.BinarySearch函数? 因为二分算法如此重要,所以要多加练习。 但是它的返回值,也有三种状态,导致很多人使用它的时候, 也感觉到迷惑的。 在这里的例子演示了三种返回值的使用: /** C# Program to Search an element with Array Indices*/ using …...
量化交易系统开发-实时行情自动化交易-8.5.VNPY平台
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于VNPY平台介绍。 VN.PY 是…...
分治算法中的主定理及其应用
引言 学习递归算法的时候,找到了用来计算算法复杂度的主定理。问大语言模型,发现回答的主定理描述有所不同。本文比较了两个不同版本中表述的差异。并给出一些例子用来计算分治递归类算法的复杂度。 主定理的不同版本 版本1 在《算法导论》第三版第四…...
前端的面试题
1.常用的块与行属性内标签有哪些?有什么特征? 块标签:div、h1~h6、ul、li、table、p、br、form。 特征:独占一行,换行显示,可以设置宽高,可以嵌套块和行 行标签:span、a、img、text…...
vue实现excel导出导入
文章目录 安装xlsx依赖和file-saver依赖Excel导出使用element-ui的el-table展示数据定义导出按钮将数据导出 excel导入定义文件导入显示框定义导入按钮解析选择的文件进行导入 安装xlsx依赖和file-saver依赖 npm install xlsx -S npm install file-saver -SExcel导出 使用ele…...
婚纱摄影管理系统|Java|SSM|VUE| 前后端分离
【重要1⃣️】前后端源码万字文档部署文档 【重要2⃣️】正版源码有问题包售后 【重要3⃣️】虚拟可复制品不支持退换货 【重要3⃣️】虚拟可复制品不支持退换货 【重要3⃣️】虚拟可复制品不支持退换货 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【…...