Java面试重点之反射机制

一、 反射是什么?

允许程序在运行时查询和操作对象的类型信息。通过反射,程序能够在运行时获取对象的类定义信息,如类的名称、方法、字段、注解等,并且可以动态地调用对象的方法或访问其字段,而无需在编译时具体知道对象的类。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。
Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

二、为什么反射机制能实现动态获取?

1. Class对象: 在Java中,每个类都有一个对应的Class对象,可以通过类名或对象实例的getClass()方法获取。Class对象包含了类的结构信息,如类的方法、属性、构造函数等。

2. 获取类的信息: 反射机制允许在运行时通过Class对象来获取类的各种信息,如方法、属性、注解等。通过Class对象的方法,如getMethod()、getField()等,可以获取类的方法、属性等的信息。

3. 调用方法和访问属性: 反射机制允许在运行时动态地调用类的方法、访问类的属性。通过Method对象的invoke()方法,可以调用类的方法;通过Field对象的get()、set()方法,可以访问类的属性。

4. 实例化对象: 反射机制还可以在运行时动态地实例化对象。通过Class对象的newInstance()方法,可以创建类的实例。

三、 反射的用途

很多流行的Java框架,如Spring、Spring Boot和MyBatis等,都广泛使用了反射机制和动态代理。

1. 在Spring和Spring Boot中,通过依赖注入和面向切面编程(AOP),框架能够在运行时动态地管理和配置组件。这通常涉及到在运行时创建对象、调用对象的方法以及处理依赖关系,其中反射机制发挥了关键作用。Spring的核心容器使用反射来实现依赖注入,动态地创建和管理bean。同时,Spring AOP利用动态代理来实现切面的织入,以便在方法调用前后执行额外的逻辑。

2. 在MyBatis中,动态代理也是其实现原理的关键部分。在Mybatis的开发过程中,程序员更加关注 Mapper接口中的方法以及 xxxMapper.xml文件的编写。但是我们仅仅只是写了一个方法名和Sql语句,并且接口是不能被实例化的,那么Mybatis是如何通过 Mapper接口来执行对应的Sql语句呢?

答:MyBatis使用动态代理来创建Mapper接口的实现类,从而避免了手动编写SQL语句和结果集的映射代码。通过动态代理,MyBatis能够在运行时根据Mapper接口的方法动态地生成SQL并执行数据库操作。具体来说,通过 sqlSession.getMapper(UserMapper.class) 方法获取 Mapper 接口的实例时,实际上是通过动态代理生成了一个符合 Mapper 接口定义的实现类,并将其返回给调用者。这样可以在运行时动态地生成 SQL 语句,实现与 Mapper 接口方法的映射,从而将 Mapper 接口与实际的 SQL 实现解耦。
下面是一个简单的示例,演示了如何在MyBatis中使用XML文件定义SQL语句:

(1)创建XML文件:首先,创建一个XML文件,通常以.xml为后缀,用于定义SQL映射。在该文件中,可以定义SQL语句以及参数映射、结果映射等信息。

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper"><select id="getUserById" resultType="com.example.model.User">SELECT * FROM users WHERE id = #{id}</select>
</mapper>

(2)创建Mapper接口:然后,创建一个Java接口,用于与XML文件进行关联。该接口中定义的方法名称和XML文件中定义的SQL语句的id相对应。

// UserMapper.java
package com.example.mapper;import com.example.model.User;public interface UserMapper {User getUserById(int id);
}

(3)配置MyBatis:在MyBatis的配置文件中,通常是mybatis-config.xml,配置MyBatis扫描XML文件的位置,并将其与对应的Mapper接口进行关联。

<!-- mybatis-config.xml -->
```xml
```xml
```xml
```xml

(4)使用Mapper接口:最后,在应用程序中通过MyBatis的SqlSession对象来获取Mapper接口的实例,并调用定义的方法执行SQL语句。

// 使用Mapper接口执行SQL语句
SqlSession sqlSession = ...; // 获取SqlSession对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(123);

3. Java 中的一大利器 注解 的实现也用到了反射。为什么使用 Spring 的时候 ,一个@Component注解就声明了一个类为 Spring Bean 呢?为什么你通过一个 @Value注解就读取到配置文件中的值呢?究竟是怎么起作用的呢?

答:在Spring框架中,@Component注解用于标识一个类作为Spring管理的组件,也就是所谓的Spring Bean。当Spring容器启动时,它会扫描类路径下的所有组件,并根据注解的配置将它们实例化为Bean,然后将它们管理起来。这样,我们就可以在应用程序中通过依赖注入的方式来使用这些Bean。
而@Value注解用于从外部配置文件中读取值,并将这些值注入到标记了该注解的字段或方法参数中。通过在配置文件中设置对应的键值对,Spring在启动时会解析配置文件,并将对应的值注入到使用了@Value注解的位置。

4.JDBC(Class.forName导致类加载)

如果只是希望一个类的静态代码块执行,其它代码不执行,可以使用:

Class.forName("完整类名");

这个方法的执行会导致类加载,类加载时,静态代码块执行。
还有其他用途就不一一列举了。

四、反射的重要类和要注意的问题:

在这里插入图片描述
性能问题: 反射操作通常比非反射代码慢,因为它需要在运行时解析相关的类信息。
安全问题: 使用反射可以访问和修改类的私有成员,这可能会破坏封装性,导致安全隐患。
复杂性: 反射代码通常比直接代码复杂,可能难以阅读和维护。

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

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

相关文章

编写你的第一个 golang 的应用程序

进行你的第一个golang的程序 当你把程序都安装好以后 环境变量配置 好 vscode 插件下载好以后 1. 创建一个test.go 的文件 //主包&#xff0c;可执行文件所在包 package main//导入包 import "fmt"//主函数&#xff0c;入口函数 func main() { }2.解释 需要导入包 …

WPF之border标签边框控件、设置弧度、图片

border标签在WPF中承担着边框的角色又称之为边框标签&#xff0c;使用嵌套的方法去给一些标签添加边框&#xff0c;border标签包裹目标标签(border不能有多个子元素)。一般在给标签添加弧度时可以使用border。 常用属性 CornerRadius边框拐角的弧度&#xff0c;当宽高是一样的…

Alibaba Cloud Linux 3.2104 LTS 64位安装mysql 8.0报错

问题描述 Alibaba Cloud Linux 3.2104 LTS 64位安装mysql 8.0提示 Error&#xff1a; GPG check FAILED 问题原因 官方 MySQL 存储库的 GPG 密钥已过期&#xff0c;无法安装或更新 MySQL 包 mysql官网也提交了该bug&#xff1a; https://bugs.mysql.com/bug.php?id106188 …

动态增删表格

期望目标&#xff1a;实现一个能通过按钮来动态增加表格栏&#xff0c;每次能添加一行&#xff0c;每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…

Pandas Series的运算原来这么简单

Series的运算主要包括加法、减法、乘法和除法等基本算术运算。这些运算通常是按照索引对应计算的&#xff0c;如果两个Series的索引不同&#xff0c;则结果中对应位置将填充为NaN&#xff08;空值&#xff09;。 需要注意的是&#xff0c;在进行Series运算时&#xff0c;需要确…

【linux】进程(深入理解linux进程状态)

开始之前先说一个与本文无关的小知识&#xff0c;chdir命令可以更改当前进程的工作目录哦。 目录 linux具体进程状态&#xff1a;R && S&#xff1a;T && t&#xff1a;D&#xff1a;僵尸进程 && 孤儿进程&#xff1a; OS的理论线&#xff1a;运行&…

讯饶科技 X2Modbus 敏感信息泄露

讯饶科技 X2Modbus 敏感信息泄露 文章目录 讯饶科技 X2Modbus 敏感信息泄露漏洞描述影响版本实现原理漏洞复现修复建议 漏洞描述 X2Modbus是一款功能很强大的协议转换网关&#xff0c; 这里的X代表各家不同 的通信协议&#xff0c;2是To的谐音表示转换&#xff0c;Modbus就是最…

Ps:应用智能锐化滤镜

智能锐化 Smart Sharpen滤镜具有“USM 锐化”滤镜所没有的锐化控制功能。不仅可以设置不同的锐化算法&#xff0c;还可以分别控制在阴影区域和高光区域中进行的锐化量。 ◆ ◆ ◆ 一般使用方法与步骤 1、根据模糊的原因选择“移去”算法&#xff0c;默认是“高斯模糊”。 2、…

制作场景资源的Prefab

制作骨骼模型的Prefab 现在游戏内的使用骨骼模型是通过老版的Animator去实现控制的&#xff0c;所以需要将模型切换为Animator 第一步&#xff0c;动画类型设置为Generic&#xff0c;创建Avatar 模型里面会有对应的Avatar文件 我们还需要一个Controller文件&#xff0c;用于…

Go 语言基础(二)【数组、切片、指针、map、struct】

1、数组 特别需要注意的是&#xff1a;在 Go 语言中&#xff0c;数组长度也是数组类型的一部分&#xff01;所以尽管元素类型相同但是长度不同的两个数组&#xff0c;它们的类型并不相同。 1.1、数组的初始化 1.1.1、通过初始化列表{}来设置值 var arr [3]int // int类型的数…

ArrayList知识点详解

目录 1.简介 2.ArrayList的使用 &#xff08;1&#xff09;如何实例化ArrayList&#xff1f;&#xff08;如何创建&#xff1f;&#xff09; &#xff08;2&#xff09;如何构造使用&#xff1f; &#xff08;3&#xff09;为什么ArrayList的无参构造可以添加数据 &#…

rust疑难杂症

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…

深入理解多层感知机MLP

1. 基础理论 神经网络基础&#xff1a; 目标&#xff1a;了解神经网络的结构&#xff0c;包括神经元、权重、偏置和激活函数。 神经网络是由多个层次的神经元组成的网络&#xff0c;它模拟了人脑处理信息的方式。每个神经元可以接收输入、处理输入并生成输出。这一过程涉及到…

c#数据库: 11.分组统计学生信息/ 12.视图查询

该例以学生信息表为例&#xff0c;将学生信息按年级和性别分组&#xff0c;统计各年级男生和女生的人数、总成绩和平均成绩&#xff0c;并将查询结果按平均成绩降序排列。下图是原数据表staq: 【C#实现过程】 &#xff08;1&#xff09;创建一个名为StudentGroup的窗体应用程序…

RK3588S和ARM阵列服务器在虚拟化云平台的应用

RK3588是瑞芯微2021年底推出的首款高端8nm旗舰芯片&#xff0c;而RK3588S 则是针对消费端市场在RK3588基础上缩减了部分外围接口&#xff0c;CPU、GPU和NPU等主要参数得到了保留&#xff0c;主要应用范围为高端ARM平板、ARM笔电产品&#xff0c;会议平板类、ARM服务器、智能机器…

如何批量删除多个不同路径的文件但又保留文件夹呢

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、我准备了三个文件夹&#xff08;实际操作的时候可能是上百个文件夹&#xff0c;无所谓&#xff09;&#xff0c;里面都放了两个图片 2、然后打开工具&am…

【Gateway】网关集成Knife4j—swagger接口文档

文章目录 前言一、相关配置1.网关gateway配置①.网关增加配置 pom文件②.网关增加配置 SwaggerHandler③.网关增加配置 SwaggerResourceConfig④.网关增加配置 SwaggerConfig 2.网关过滤器 二、接口文档使用1.访问文档2.查看文档 总结 前言 在日常开发中是需要前后端联调的&am…

09_Scala函数和对象

文章目录 函数和对象1.函数也是对象 scala中声明了一个函数 等价于声明一个函数对象2.将函数当作对象来用&#xff0c;也就是访问函数&#xff0c;但是不执行函数结果3.对象拥有数据类型(函数类型)&#xff0c;对象可以进行赋值操作4.函数对象类型的省略写法&#xff0c;也就是…

变电站综合自动化系统:Modbus-PLC-645转IEC104网关方案

前言 电力行业作为关系国计民生的重要基础产业&#xff0c;是关系千家万户的公用事业。但是要做好电力行业安全保障工作的前提&#xff0c;是需要对应的技术人员详细了解电力工业使用的系统、设备以及各类协议的安全特性&#xff0c;本文将主要介绍IEC 104协议的定义和钡铼技术…

mac用Homebrew安装MySQL并配置远程登录

1. 简介 MySQL 是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;后被 Oracle 公司收购。MySQL 使用 SQL&#xff08;Structured Query Language&#xff09;作为查询语言&#xff0c;并提供了强大的功能和性能…