Java面试重点之反射机制

news/2024/5/20 8:41:48

一、 反射是什么?

允许程序在运行时查询和操作对象的类型信息。通过反射,程序能够在运行时获取对象的类定义信息,如类的名称、方法、字段、注解等,并且可以动态地调用对象的方法或访问其字段,而无需在编译时具体知道对象的类。本质是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.mrgr.cn/p/62300467

相关文章

【SQL每日一练】统计复旦用户8月练题情况

文章目录 题目一、分析二、题解1.使用case...when..then2.使用if 题目 现在运营想要了解复旦大学的每个用户在8月份练习的总题目数和回答正确的题目数情况&#xff0c;请取出相应明细数据&#xff0c;对于在8月份没有练习过的用户&#xff0c;答题数结果返回0. 示例代码&am…

Java17 --- SpringCloud之Gateway

目录 一、Gateway网关创建 1.1、创建微服务子工程9527及配置和依赖 1.1.1、pom依赖 1.1.2、yml配置 1.1.3、主启动类并测试入驻consul 二、实现路由映射 2.1、服务8001新增测试代码 2.2、修改9527服务yml配置文件 2.3、远程调用接口加gateway 2.3.1、新增80服务测…

企业车辆管理系统参考论文(论文 + 源码)

【免费】关于企业车辆管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89282550 企业车辆管理系统 摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理…

JavaScript异步编程——05-回调函数

我们在前面的文章《JavaScript 基础&#xff1a;异步编程/单线程和异步》中讲过&#xff0c;Javascript 是⼀⻔单线程语⾔。早期我们解决异步场景时&#xff0c;⼤部分情况都是通过回调函数来进⾏。 &#xff08;如果你还不了解单线程和异步的概念&#xff0c;可以先去回顾上一…

OpenVX技术图例(二)

OpenVX技术图例(二) 参考文献链接 https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/tiovx/docs/user_guide/index.html人工智能芯片与自动驾驶

贪吃蛇小游戏(c语言)

1.效果展示 屏幕录制 2024-04-28 205129 2.基本功能 • 贪吃蛇地图绘制 • 蛇吃食物的功能 &#xff08;上、下、左、右方键控制蛇的动作&#xff09; • 蛇撞墙死亡 • 蛇撞自身死亡 • 计算得分 • 蛇身加速、减速 • 暂停游戏 3.技术要点 C语言函数、枚举、结构…

(7)ram ip使用

一、ram相关介绍 本实验使用一个控制模块对ram ip进行控制(本质上是三个计数器) 二、ip使用 在界面中选择IP catalog,搜索block,选择底下这个,双击即可生成ram的ip下面进行一些ram资源的配置 配置好后点击ok,生成ip,可以在这里看到已经生成好了: 这里点开这个.veo文件,…

深入了解 NumPy:深度学习中的数学运算利器

文章目录 1. 导入NumPy2. 创建NumPy数组3. 数组的算术运算4. N维数组4.1 创建和操作多维数组4.2 高维数组 5. NumPy的广播功能5.1 基本广播示例5.2 更复杂的广播示例 6. 访问数组元素6.1 基于索引的访问6.2 遍历数组6.3 基于条件的访问6.4 高级索引6.5 性能考虑 在深度学习和数…

Crowd counting 系列NO.2—MCNN

声明&#xff1a;博客是用latex写的&#xff0c;所以直接用图片来展示吧&#xff0c;效果是一样的。下载资源网上都很容易搜到&#xff0c;如需下载资源&#xff0c;请留言。

韩顺平0基础学Java——第5天

p72——p86 今天同学跟我说别学java&#xff0c;真的吗&#xff1f;唉&#xff0c;先把这视频干完吧。 逻辑运算符练习 x6&#xff0c;y6 x6&#xff0c;y5 x11&#xff0c;y6 x11&#xff0c;y5 z48 错了&a…

超级大转盘!(html+less+js)(结尾附代码)

超级大转盘&#xff01;&#xff08;结尾附代码&#xff09; 网上看到有人用转盘抽奖&#xff0c;怀疑是不是有问题&#xff0c;为什么每次都中不了&#xff0c;能不能整个转盘自己想中啥中啥&#xff0c;查阅了网上写得好的文章&#xff0c;果然实现了只中谢谢参与&#xff0…

《21天学通C++》(第十二章)运算符类型与运算符重载

1.为什么要重载运算符&#xff1f; 通过重载运算符&#xff0c;可以将复杂的操作封装成简单的运算符形式&#xff0c;简化代码&#xff0c;提高可读性下面举一个简单的例子 计算两个点的坐标之和。 1.不重载运算符 #include <iostream> using namespace std; class P…

低功耗数字IC后端设计实现典型案例| UPF Flow如何避免工具乱用Always On Buffer?

下图所示为咱们社区低功耗四核A7 Top Hierarchical Flow后端训练营中的一个案例&#xff0c;设计中存在若干个Power Domain&#xff0c;其中Power Domain2(简称PD2)为default Top Domain&#xff0c;Power Domain1&#xff08;简称PD1&#xff09;为一个需要power off的domain&…

STM32单片机实战开发笔记-I2C通讯总线【wulianjishu666】

嵌入式单片机开发实战例程合集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11av8rV45dtHO0EHf8e_Q0Q?pwd28ab 提取码&#xff1a;28ab I2C模块测试 功能描述 I2C总线接口连接微控制器和串行I2C总线。它提供多主机功能&#xff0c;控制所有I2C总线特定的时序&am…

云HIS源码,基于云计算的医院临床信息系统(有应用案列)

云HIS全套商业源码&#xff0c;基于云计算的医院临床信息系统 提供预约挂号、门急诊收费、门诊医生站、护士工作站、药房药库管理、电子病历、住院医生站、住院护士工作站、住院登记结算、出院管理、病案管理、医药价格管理、财务管理、统计查询、会员管理等业务及管理功能。 …

【Android】Room数据库的简单使用方法

Room数据库的使用方法 目录 1、添加Room数据库的依赖2、Entity——定义实体类 2.1 定义主键——PrimaryKey2.2 字段注解——ColumnInfo 3、Dao——定义数据访问对象4、Database——数据库 4.1 通过回调观察数据库是否创建成功 5、使用时注意点6、编写异步 DAO 查询 6.1 写异步…

python作业五

题目&#xff1a;注册登录 制作一个注册登录模块 注册&#xff1a;将用户填入的账户和密码保存到一个文件(users.bin) 登陆&#xff1a;将用户填入账户密码和users.bin中保存的账户密码进行比对,如果账户和密码完全相同 那 么登录成功&#xff0c;否则登录失败…

Linux基础之git与调试工具gdb

目录 一、git的简单介绍和使用方法 1.1 git的介绍 1.2 git的使用方法 1.2.1 三板斧之git add 1.2.2 三板斧之git commit 1.2.3 三板斧之git push 二、gdb的介绍和一些基本使用方法 2.1 背景介绍 2.2 基本的使用方法 一、git的简单介绍和使用方法 1.1 git的介绍 Git是一…

国科大深度学习期末历年试卷

本文借鉴 国科大深度学习复习 深度学习期末 深度学习2020 一&#xff0e;名词解释&#xff08;每个2分&#xff0c;共10分&#xff09; 深度学习&#xff0c;稀疏自编码器&#xff0c;正则化&#xff0c;集成学习&#xff0c;Dropout 二&#xff0e;简答题&#xff08;每题…

ICode国际青少年编程竞赛- Python-2级训练场-列表入门

ICode国际青少年编程竞赛- Python-2级训练场-列表入门 1、 Dev.step(3)2、 Flyer.step(1) Dev.step(-2)3、 Flyer.step(1) Spaceship.step(7)4、 Flyer.step(5) Dev.turnRight() Dev.step(5) Dev.turnLeft() Dev.step(3) Dev.turnLeft() Dev.step(7) Dev.turnLeft() Dev.…