Java的反射机制以及使用场景

Java的反射机制以及使用场景

  • 什么是反射
  • Class对象
  • 如何使用
    • 获取 Class 类对象
    • 反射创造对象
      • 反射获取类的构造器
      • 反射获取类的成员变量
      • 反射获取类的方法
  • 反射的应用场景
    • JDBC 的数据库的连接
    • Spring 框架的使用

什么是反射

Oracle 官方对反射的解释

Reflection is commonly used by programs which require the ability to examine or
modify the runtime behavior of applications running in the Java virtual machine.
This is a relatively advanced feature and should be used only by developers who
have a strong grasp of the fundamentals of the language. With that caveat in
mind, reflection is a powerful technique and can enable applications to perform
operations which would otherwise be impossible.

Java 的反射机制是指:

  • 在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;
  • 并且对于任意一个对象,都能够调用它的任意一个方法;
  • 这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制。

白话解释

万物有阴必有阳,有正必有反。既然有反射,就必有“正射”。

那么正射是什么呢?

  1. 正射

我们在编写代码时,当需要使用到某一个类的时候,都会先了解这个类是做什么的。然后实例化这个类,接着用实例化好的对象进行操作,这就是正射。

Student student = new Student();
student.doHomework("数学");
  1. 反射

反射就是,一开始并不知道我们要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。

 Class clazz = Class.forName("reflection.Student");Method method = clazz.getMethod("doHomework", String.class);Constructor constructor = clazz.getConstructor();Object object = constructor.newInstance();method.invoke(object, "语文");

正射与反射对比

以上两段代码,执行效果是一样的,如图:

在这里插入图片描述
但是,其实现的过程还是有很大的差别的:

第一段代码在未运行前就已经知道了要运行的类是Student;

第二段代码则是到整个程序运行的时候,从字符串reflection.Student,才知道要操作的类是Student。

结论

反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。

Class对象

要理解Class对象,我们先来了解一下RTTI吧。

RTTI(Run-Time Type Identification)运行时类型识别,其作用是在运行时识别一个对象的类型和类的信息。

Java是如何让我们在运行时识别对象和类的信息的?主要有两种方式:

  • 一种是传统的RRTI,它假定我们在编译期已知道了所有类型。
  • 另一种是反射机制,它允许我们在运行时发现和使用类的信息。

每个类都有一个Class对象,每当编译一个新类就产生一个Class对象(更恰当地说,是被保存在一个同名的.class文件中)。比如创建一个Student类,那么,JVM就会创建一个Student对应Class类的Class对象,该Class对象保存了Student类相关的类型信息。

在这里插入图片描述

Class类的对象作用是运行时提供或获得某个对象的类型信息。

如何使用

获取 Class 类对象

获取反射中的Class对象有三种方法。

  • 第一种,使用 Class.forName 静态方法。
Class class1 = Class.forName("reflection.TestReflection");
  • 第二种,使用类的.class 方法
Class class2 = TestReflection.class;
  • 第三种,使用实例对象的 getClass() 方法。
TestReflection testReflection = new TestReflection();
Class class3 = testReflection.getClass();

在这里插入图片描述

反射创造对象

通过反射创造对象,获取方法,成员变量,构造器

通过反射创建类对象主要有两种方式:

在这里插入图片描述

实例代码:

//方式一
Class class1 = Class.forName("reflection.Student");
Student student = (Student) class1.newInstance();
System.out.println(student);//方式二
Constructor constructor = class1.getConstructor();
Student student1 = (Student) constructor.newInstance();
System.out.println(student1);

运行结果:

在这里插入图片描述

反射获取类的构造器

在这里插入图片描述

反射获取类的成员变量

在这里插入图片描述

反射获取类的方法

在这里插入图片描述

反射的应用场景

反射是Java框架的灵魂技术,很多框架都使用了反射技术,如spring,Mybatis,Hibernate等。

JDBC 的数据库的连接

在JDBC连接数据库中,一般包括加载驱动,获得数据库连接等步骤。而加载驱动,就是引入相关Jar包后,通过Class.forName() 即反射技术,加载数据库的驱动程序。

Spring 框架的使用

Spring 通过 XML 配置模式装载 Bean,也是反射的一个典型例子。
装载过程:

  1. 将程序内XML 配置文件加载入内存中
  2. Java类解析xml里面的内容,得到相关字节码信息
  3. 使用反射机制,得到Class实例
  4. 动态配置实例的属性,使用

这样做当然是有好处的:
不用每次都去new实例了,并且可以修改配置文件,比较灵活。

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

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

相关文章

从零自制docker-14-【实现 mydocker commit 打包容器成镜像】

文章目录 目标注意exec.Commandtar代码结果 目标 piveroot切换工作目录到/merged后,通过docker commit将此时工作目录的文件系统保存下来,使用tar包将该文件系统打包为tar文件 命令类似 ./mydocker commit myimage然后当前目录下会得到myimage.tar 注意…

「实用推荐」如何为桌面 移动跨平台应用选择UI框架/APP架构?

DevExpress .NET MAUI UI组件库提供了用于Android和iOS移动开发的高性能UI组件,该库包括数据网格、图表、日程、数据编辑器、CollectionView和选项卡组件。 获取DevExpress .NET MAUI最新正式版下载(Q技术交流:532598169) “一次编写&#…

ABB机器人---基础编程

目录 第一章 代码解释 1.1 基础代码 1.1.2 关于 VAR robtarget pos 1.1.3 关于四元数 1.2 机器人初始化程序 1.3 配置通信 (ProfiNet 示例,ABB RAPID) 1.4 设置干涉区 (ABB RAPID) 1.5 示教轨迹和自动过程 (ABB RAPID) 1.6 配置抓手并进行抓取操作 (ABB RA…

springboot错误

错误总结 1、使用IDEA 的 initialalzer显示2、IDEA 新建文件 没有 java class3、java: 错误: 不支持发行版本 22解决方法4、IDEA-SpringBoot项目yml配置文件不自动提示解决办法 1、使用IDEA 的 initialalzer显示 IDEA创建SpringBoot项目时出现:Initialization fail…

公认最好用的随身wifi品牌推荐!欧本VS闪鱼VS格行随身wifi哪款更好用?欧本随身wifi靠谱吗?

最近小编后台私信快被问爆了,都想让测评一下自己相中的随身wifi到底行不行。该说不说随身wifi品牌真是越来越多了,今天就挑选咨询量最多的三款:格行,欧本,闪鱼!咱们各方面都实测一下,看看哪款更…

基于ucos-ii操作系统的生产者消费者-问题

目 录 第1章 题目分析. 1 1.1 生产者线程... 1 1.2 消费者线程... 1 1.3 缓冲区... 1 1.4 进程的同步与互斥... 1 第2章 解决方案. 2 2.1 总体方案... 2 2.2 生产者问题... 2 2.3 消费者问题... 3 2.4 进程问题... 5 第3章 实验结果. 6 3.1 运行结果... 6 3.2 结果分析... 8 第…

提取 Chrome、Firefox 中储存的用户密码用于凭据发现

操作环境 Chrome 浏览器 Version 125.0.6422.112 (Official Build) (64-bit)Firefox 浏览器 Version 126.0 (64 位) Chrome 浏览器储存密钥原理 新的 Chrome 浏览器储存密码的方案是使用 Chrome 生成的 AES 密钥对用户密码进行加密之后储存在 Sqlite 数据库文件中,A…

Linux 内核之 mmap 内存映射的原理及源码解析

文章目录 前言一、简介1. mmap 是什么?2. Linux 进程虚拟内存空间 二、mmap 内存映射1. mmap 内存映射的实现过程2. mmap 内存映射流程2.1 mmap 系统调用函数2.2 ksys_mmap_pgoff 函数2.3 vm_mmap_pgoff 函数2.4 do_mmap_pgoff 函数2.5 do_mmap 函数2.6 get_unmappe…

私域流量的真谛:构建并运营属于你自己的私域生态

大家好,我是来自一家专注于私域电商行业的软件开发公司的产品经理,拥有超过七年的行业经验。今天,我想和大家聊聊私域流量的真正含义,以及为何我们应该关注并努力打造属于自己的私域生态。 什么是私域流量? 私域流量&…

HCIA第二天复习上

延长传输距离-------中继器(放大器)------物理层设备 可以延长5倍传输距离 增加网络节点数量 网络拓扑结构 1直线型拓扑 信息安全性差 网络延迟高传输速度慢 2环形拓扑 3星型拓扑 4网状型拓扑 传输效率高,…

【字典树 马拉车算法】336. 回文对

本文涉及知识点 字典树 马拉车算法 336. 回文对 给定一个由唯一字符串构成的 0 索引 数组 words 。 回文对 是一对整数 (i, j) &#xff0c;满足以下条件&#xff1a; 0 < i, j < words.length&#xff0c;i ! j &#xff0c;并且words[i] words[j]&#xff08;两个字…

通过注意力调节实现更好的文本到图像生成对齐

近年来&#xff0c;生成性AI技术在众多领域取得了前所未有的进步。大规模预训练模型的出现激发了各种下游任务中的新应用。这在文本到图像生成领域尤为明显&#xff0c;例如Stable Diffusion、DALL-E 2和Imagen等模型已经显著展示了它们的能力。尽管如此&#xff0c;复杂提示中…

appium篇-windows桌面自动化(一)[环境配置]

1、windows版本&#xff1a;win10 2、winSdk版本 Windows SDK and emulator archive | Microsoft Developer 3、winAppDriver版本 1.2.99 Releases microsoft/WinAppDriver (github.com) ################ 4、python版本 Python 3.9.13 ############### 5、appium版本 Re…

hubilder Android模拟器华为手机连接不上

APP真机测试注意点&#xff1a; 1. 同一个局域网下 2. 手机连接USB模式&#xff08;华为选择USB配置&#xff1a;音频来源&#xff09; &#xff0c;开发者模式 3. 实在不行重启HBuilderX再运行真机 可是卡在了“正在安装手机端HBuilder调试基座...” 就没反应了&#xff1f;&…

【高时效通路】

一 高时效通路 1.1 pathchdumper 实时数据拉取、实时数据处理、5分钟微批dump来加速时效性&#xff0c;具体来说&#xff1a; 实时数据拉取&#xff08;Fetcher&#xff09;&#xff1a;基于Databus Fetcher基建&#xff0c;直接对接F0层实时拉取最新数据&#xff0c;保证该…

Springboot整合Minio对象存储超级详细讲解以及配置搭建

windows环境下搭建minio步骤 1.从minio官网进行查看详细信息 地址&#xff1a;https://min.io/里面有详细的配置信息搭建成功之后如下如所示&#xff1a;用户名密码默认情况下为 username&#xff1a;minioadmin password&#xff1a;minioadmin2.搭建成功之后的访问 地址&…

vue项目实战 - 如果高效的实现防抖和节流

在Vue项目中&#xff0c;处理高频事件的优化至关重要&#xff0c;直接影响用户体验和应用性能。防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常用且有效的方法&#xff0c;可以控制事件触发频率&#xff0c;减少不必要的资源消耗。如何在…

SEO优化,小白程序员如何做SEO优化流量从0到1

原文链接&#xff1a;SEO优化&#xff0c;小白程序员如何做SEO优化流量从0到1 1、SEO是什么&#xff1f; SEO即&#xff1a;搜索引擎优化(Search Engine Optimization)&#xff0c;是一种通过优化网站结构、内容和外部链接等因素&#xff0c;提高网站在搜索引擎中的自然排名&…

DeepDriving | CUDA编程-03:线程层级

本文来源公众号“DeepDriving”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;CUDA编程-03:线程层级 DeepDriving | CUDA编程-01&#xff1a; 搭建CUDA编程环境-CSDN博客 DeepDriving | CUDA编程-02&#xff1a; 初识CUDA编程-C…

Linux之共享内存mmap用法实例(六十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…