Java反射详解:入门+使用+原理+应用场景

news2024/11/28 17:46:13

反射非常强大和有用,现在市面上绝大部分框架(spring、mybatis、rocketmq等等)中都有反射的影子,反射机制在框架设计中占有举足轻重的作用。

所以,在你Java进阶的道路上,你需要掌握好反射。

怎么才能学好反射,我们需要弄懂以下几个问题:

1.反射是什么?

2.反射有什么用?

3.反射的实现原理?

4.怎么用反射?

下面我就针对以上的疑问,一一来讲解。

反射是什么?

反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。

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

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

为什么要用反射?

Java Reflection功能非常强大,并且非常有用,比如:

  • 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等
  • 获取任意对象的属性,并且能改变对象的属性
  • 调用任意对象的方法
  • 判断任意一个对象所属的类
  • 实例化任意一个类的对象
  • 通过反射我们可以实现动态装配,降低代码的耦合度,动态代理等。

怎么使用反射?

一般情况下我们通过反射创建类对象主要有两种方式:

  • 通过 Class 对象的 newInstance() 方法
  • 通过 Constructor 对象的 newInstance() 方法

第一种:通过 Class 对象的 newInstance() 方法。

Class clz = Class.forName("com.lxx.reflection.Hello");
Hello hello= (Hello)clz.newInstance();

第二种:通过 Constructor 对象的 newInstance() 方法

Class clz = Class.forName("com.lxx.reflection.Hello");
Constructor constructor = clz.getConstructor();
Hello hello= (Hello)clz.newInstance();

通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用默认的无参数构造方法,下面的代码就调用了一个有参数的构造方法进行了类对象的初始化。

Class clz = Class.forName("com.lxx.reflection.Hello");
Constructor constructor = clz.getConstructor(String.class);
Hello hello= (Hello)clz.newInstance("hello world");

接下来我们就可以通过具体的API调用获取到详细的属性或者方法等详细了。

1、获取类的成员变量的信息

Field[] fields = cls.getDeclaredFields();

更加详细成员变量获取参考如下:

方法用途
getField(String name)获取某个公有的属性对象
getFields()获取所有公有的属性对象
getDeclaredField(String name)获取某个属性对象(public和非public)
getDeclaredFields()获取所有属性对象(public和非public)

2、获得类方法

Method[] methods = cls.getDeclaredMethods();

更加详细方法获取参考如下:

方法用途
getMethod(String name,Class…<?> parameterTypes)获取该类某个公有的方法
getMethods()获取该类所有公有的方法
getDeclaredMethod(String name,Class…<?> parameterTypes)获取该类某个方法(public和非public)
getDeclaredMethods()获取该类所有方法(public和非public)

3、获得构造函数

Constructor[] constructors = cls.getDeclaredConstructors();

更加详细方法获取参考如下:

方法用途
getConstructor(Class…<?> parameterTypes)获取该类中与参数类型匹配的公有构造方法
getConstructors()获取该类中所有公有构造方法
getDeclaredConstructor(Class…<?> parameterTypes)获取该类中与参数类型匹配的构造方法
getDeclaredConstructors()获取该类所有构造方法

通过以上一个小案例了解了反射的使用,但如果你想对反射掌握得更好,还需深入理解反射背后的底层实现原理。

反射工作原理?

调用反射的总体流程如下:

1、当我们编写完一个Java项目之后,每个java文件都会被编译成一个.class文件。

在这里插入图片描述

2、这些class文件在程序运行时会被ClassLoader加载到JVM中,当一个类被加载以后,JVM就会在内存中自动产生一个Class对象。

在这里插入图片描述

3、通过Class对象获取Field/Method/Construcor

在这里插入图片描述

我们一般平时是通过new的形式创建对象实际上就是通过这些Class来创建的,只不过这个class文件是编译的时候就生成的,程序相当于写死了给jvm去跑。

在这里插入图片描述

反射是什么呢?当我们的程序在运行时,需要动态的加载一些类,这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载。

原来使用new的时候,需要明确的指定类名,这个时候属于硬编码实现,而在使用反射的时候,可以只传入类名参数,就可以生成对象,降低了耦合性,使得程序更具灵活性。

反射的应用场景

在这里插入图片描述

举个例子我们的项目底层数据库有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.lxx.java.myqlConnection,com.lxx.java.oracleConnection这两个类我们要用。

这时候我们在使用 JDBC 连接数据库时使用 Class.forName()通过反射加载数据库的驱动程序,如果是mysql则传入mysql的驱动类,而如果是oracle则传入的参数就变成另一个了。

Spring 框架的 IOC(动态加载管理 Bean),Spring通过配置文件配置各种各样的bean,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。

还有Spring AOP(动态代理)功能都和反射有关系。

除此之外还有很多框架:mybatis、dubbo、rocketmq等等都会用到反射机制。

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

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

相关文章

STM32CubeIDE安装中文语言包

软件包地址&#xff1a;https://archive.eclipse.org/technology/babel/update-site/R0.16.1/2018-12/ 打开IDE&#xff1a;Help--->Install New Software--->Add Locations&#xff1a;输入软件包地址 等待搜索结束&#xff1a;选择中文语言包&#xff0c;单击next进行安…

QQ邮箱发送验证码源码/API+HTML源码/支持API接口、自定义地址和内容/简单易用

源码简介&#xff1a; 一款支持API接口、自定义QQ邮箱地址、自定义邮箱标题和内容的源码。 近来我正在开发一款新的软件&#xff0c;但在注册环节中遇到了一个问题&#xff1a;需要使用QQ邮箱验证码。因此&#xff0c;我积极寻找相关的API接口或开发文档&#xff0c;但遗憾的…

学习小结,学而时习之,坚持学习之,温顾学习之

学习python一个多月了&#xff0c;之前也有接触过&#xff0c;还花了不少钱报班&#xff0c;看了看入门的头两节课&#xff0c;就止步了。每一种编程语言的入门感觉都差不多&#xff0c;学到现在&#xff0c;我对python的基本数据类型还是没掌握好啊&#xff0c;每次列表字典怎…

面向萌新的数学建模入门指南

时间飞逝&#xff0c;我的大一建模生涯也告一段落。感谢建模路上帮助过我的学长和学姐们&#xff0c;滴水之恩当涌泉相报&#xff0c;写下这篇感想&#xff0c;希望可以给学弟学妹们一丝启发&#xff0c;也就完成我的想法了。拙劣的文笔&#xff0c;也不知道写些啥&#xff0c;…

二叉树采用二叉链表存储:编写计算整个二叉树高度的算法

二叉树采用二叉链表存储&#xff1a;编写计算整个二叉树高度的算法 (二叉树的高度也叫二叉树的深度) 代码思路&#xff1a; 首先你要明白什么是树的高度&#xff0c;简言之就是树有多少层&#xff0c;如下图&#xff1a; 下面这棵树的高度就是4 首先我们观察根节点&#xff0…

软件测试:压力测试详解

压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&#xff0c;并确保软件在危急情况下不会崩溃。它甚至可以测试超出正常工作点的测试&#xff0c;并评估软件在极端…

使用免费 FlaskAPI 部署 YOLOv8

目标检测和实例分割是计算机视觉中关键的任务&#xff0c;使计算机能够在图像和视频中识别和定位物体。YOLOv8是一种先进的、实时的目标检测系统&#xff0c;因其速度和准确性而备受欢迎。 Flask是一个轻量级的Python Web框架&#xff0c;简化了Web应用程序的开发。通过结合Fla…

手把手教你:UE 4.27插件项目的自动化打包(Windows、Android、iOS统统搞定)

Windows平台 下载/安装Epic Games launcher&#xff1b;然后安装 Unreal Engine v4.27.2 注意&#xff1a;launcher和具体版本的engine务必安装在相同的父目录下&#xff01;如下&#xff1a; 2. 安装Visual Studio 2019或2022。安装完成后执行菜单&#xff1a;帮助 | 检查更…

3D医学三维技术影像PACS系统源码

一、系统概述 3D医学影像PACS系统&#xff0c;它集影像存储服务器、影像诊断工作站及RIS报告系统于一身,主要有图像处理模块、影像数据管理模块、RIS报告模块、光盘存档模块、DICOM通讯模块、胶片打印输出等模块组成&#xff0c; 具有完善的影像数据库管理功能&#xff0c;强大…

分享77个工作总结PPT,总有一款适合您

分享77个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/1qdoA_Ylbxkmp2Qkh9VDw8A?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 水彩插画风幼儿说课PPT模板 舞龙舞狮文化传承通…

FPGA高端项目:图像采集+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案 3、设计思路框架设计框图视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTP 全网最细解读GTP 基本结构GTP 发送和接收处理流程GTP 的参考时钟GTP 发送接口GTP …

官媒代运营:质疑代运营,理解代运营,成为代运营,超越代运营

官媒代运营 随着互联网的发展&#xff0c;品牌传播变得越来越重要。而代运营作为一种专业的、高效的品牌传播方式&#xff0c;逐渐受到企业的青睐。不过&#xff0c;很多人对代运营持质疑态度&#xff0c;认为它只是简单的外包服务。但实际上&#xff0c;代运营远不止于此&…

CV计算机视觉每日开源代码Paper with code速览-2023.11.1

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构】Battle of the Backbones: A Large-Scal…

JVM调优工具详解及调优实战(1)

文章目录 1. 前提准备2. Jmap3. Jstack4. Jinfo5. Jstat&#xff08;重点&#xff09;6. 案例分析 1. 前提准备 任意启动一个web项目&#xff0c;这里我已经启动好了 2. Jmap map命令用于生成堆转储快照&#xff0c;有时候也成为heapdump或者dump文件。Jmap不仅仅可以获取d…

易语言软件定制开发爬虫模拟协议填写自动化办公软件开发多人团队

在当今快速发展的信息化时代&#xff0c;企业对于高效、自动化的软件需求日益增长。而易语言软件定制开发爬虫模拟协议填写自动化办公软件开发多人团队&#xff0c;正是为了满足这一需求而诞生的。 一、团队背景 技术顾问、维&#xff1a;Daxiami6789 易语言软件定制开发爬虫模…

京东数据平台:2023年Q3季度黄金市场数据分析

继9月国内黄金市场持续上涨后&#xff0c;进入10月中下旬后&#xff0c;黄金行情再度反转&#xff0c;多家品牌金饰价格再次突破600元/克&#xff0c;达到611元/克。 今年以来&#xff0c;黄金行情不断走俏&#xff0c;销售市场也有明显增长。根据鲸参谋平台的数据显示&#xf…

geoserver在wms服务查询时中文乱码问题

一、geoserver上的问题 在服务查询时遇到了编码问题&#xff0c;首先就是确认数据存储位置的数据是否采用了GBK编码&#xff0c;排除geoserver的问题。 二、数据上的问题 一般高版本的arcgis或者arcgispro导出来shp的dbf文件在excel里打开中文都是乱码&#xff0c;而这个乱…

瑞明达:聚“追梦”之力,共圆“经济梦”

矢志不渝&#xff0c;笃行不怠&#xff0c;争当“一心一意同国行”的无悔“追梦人”。过往几年&#xff0c;国际形势风高浪急&#xff0c;国内环境复杂多变&#xff0c;在后疫情时代、经济恢复压力等多种超预期的因素冲击下&#xff0c;瑞明达团队全面贯彻落实国家发展政策&…

Graph 部分复习(考试向)

Graph Review OverallPage RankSpam FarmBrandes’ AlgorithmSpectral ClusteringInfuence Maxization- Independent cascade model Overall Page Rank 对于某个互联网网页A来说&#xff0c;该网页PageRank的计算基于以下两个基本假设&#xff1a; 边&#xff08;Link&#xf…

【信息安全原理】——IP及路由安全(学习笔记)

目录 &#x1f552; 1. IPv4协议及其安全性分析&#x1f552; 2. IPsec&#xff08;IP Security&#xff09;&#x1f558; 2.1 IPsec安全策略&#x1f564; 2.1.1 安全关联&#xff08;Security Association, SA&#xff09;&#x1f564; 2.1.2 安全策略&#xff08;Security…