Java面试重点之反射机制

news2024/11/19 11:25:33

一、 反射是什么?

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

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

相关文章

【LAMMPS学习】八、基础知识(5.3)Body particles体粒子

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

C语言:数据结构(双向链表)

目录 1、双向链表的结构2、顺序表和双向链表的优缺点分析3、双向链表的实现 1、双向链表的结构 注意&#xff1a;这⾥的“带头“跟前面我们说的“头节点”是两个概念&#xff0c;实际前面的在单链表阶段称呼不严谨&#xff0c;但是为了更好的理解就直接称为单链表的头节点。 带…

上位机开发PyQt(五)【Qt Designer】

PyQt5提供了一个可视化图形工具Qt Designer&#xff0c;文件名为designer.exe。如果在电脑上找不到&#xff0c;可以用如下命令进行安装&#xff1a; pip install PyQt5-tools 安装完毕后&#xff0c;可在如下目录找到此工具软件&#xff1a; %LOCALAPPDATA%\Programs\Python\…

2024人工智能“百模大战“,竞争格局分析

中国“百模大战”竞争格局分析 大模型是一个重资源禀赋和高进入门槛的赛道&#xff0c;“百模大战”是一场重投入和高消耗的持久战役。“百模大战”的上半场是资源和技术的碰撞&#xff0c;入局企业需要长久的资源支持获得高密度的人才、高质量的数据和大规模的算力&#xff0c…

Vue.js课后练习(登录注册和大小比较)

第一题 请编写登录页面和注册页面&#xff0c;通过动态组件实现动态切换页面中显示的组件&#xff0c;效果如图1和图2所示。 图1 登录页面 图2 注册页面 代码&#xff1a; my.vue代码: <template>登录 </template><script setup> </script><st…

再谈有效地访问Github

文章目录 1. 知识回顾2. 问题描述3. 问题解决3.1 Mac系统3.2 Windows系统4. 内容总结1. 知识回顾 我们在之前的内容中介绍过如何有效地访问Github。如果大家忘记的话可以点击这里查看。之前的内容主要偏重于问题的分析和解决的思路,有些朋友看了后还是不清楚如何解决问题。 …

半监督节点分类:标签传播和消息传递

基础概念回顾 传统图机器学习的特征工程——节点层面&#xff0c;连接层面&#xff0c;全图层面 节点层面&#xff1a;信用卡欺诈 连接层面&#xff1a;推荐可能认识的人 全图层面&#xff1a;预测分子结构 半监督节点分类 半监督节点分类&#xff1a;用已知标签节点预测未…

【Java EE】多线程(二)Thread 类与常用方法

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

低代码工业组态数字孪生平台

2024 两会热词「新质生产力」凭借其主要特征——高科技、高效能及高质量&#xff0c;引发各界关注。在探索构建新质生产力的重要议题中&#xff0c;数据要素被视为土地、劳动力、资本和技术之后的第五大生产要素。数据要素赋能新质生产力发展主要体现为&#xff1a;生产力由生产…

linux安装Redis 7.2.4笔记

一.保姆级安装 1.下载Redis 7.2.4安装包 sudo wget https://download.redis.io/releases/redis-7.2.4.tar.gz2.解压&#xff0c;可以指定 sudo tar -zvxf redis-7.2.4.tar.gz 3.检测并安装 GCC 编译器&#xff1a; yum 是基于 Red Hat 的 Linux 发行版&#xff08;如 CentOS、…

问卷新项目新玩法,一个2-5元,零基础,日赚50-200元零花钱,适合宝妈

问卷调研是许多机构或企业为了获取大数据技术结论&#xff0c;进行抽样调查&#xff0c;进而针对特定人群进行付费调查个人行为。问卷调查内容通常涉及新产品&#xff0c;例如通过比较不同类别的商品&#xff0c;展示某些产品的优势和劣势。我们都喜欢某款手机&#xff0c;究竟…

Docker在linux安装步骤超详细

官网 Install Docker Engine on CentOS | Docker Docs yum -y install gcc yum -y install gcc-c 安装工具 sudo yum install -y yum-utils 设置国内的镜像 yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yu…

【配置】Docker搭建JSON在线解析网站

云服务器打开端口8787 连接上docker运行 docker run -id --name jsonhero -p 8787:8787 -e SESSION_SECRETabc123 henryclw/jsonhero-webhttp://ip:8787访问 Github&#xff1a;地址

AutoCAD 2025 for mac/win:设计未来,触手可及

在数字化时代&#xff0c;设计不再局限于纸笔之间&#xff0c;而是跃然于屏幕之上&#xff0c;AutoCAD 2025正是这一变革的杰出代表。无论是Mac用户还是Windows用户&#xff0c;AutoCAD 2025都以其卓越的性能和出色的用户体验&#xff0c;成为了CAD设计绘图领域的佼佼者。 Aut…

Linux修改文件权限命令 chmod

【例子引入】 以下面命令为例&#xff1a; chmod 777 Random.py 当写入下面名为Random.py的代码后&#xff1a; 如果直接运行&#xff0c;会显示权限不够 当输入 chmod 777 Random.py 更改权限后&#xff0c;才能够正常运行 在终端中输入 这条命令是关于Linux或Unix-like系…

一周学会Django5 Python Web开发 - Django5 ORM数据库事务

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计50条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

Linux基础part-3

1、Linux一般系统查看类命令 【stat】命令 格式&#xff1a;stat [option] file显示文件的元数据信息&#xff0c;包括文件的权限、拥有者、大小、修改时间等。eg&#xff1a;stat myfile.txt 【file】命令 用于确定文件类型格式&#xff1a;file [option] filefile myfile.t…

逻辑漏洞:初识水平越权与垂直越权

目录 1、什么是越权漏洞呢&#xff1f; 2、水平越权 3、垂直越权 4、burpsuite autorize插件 最近在学习逻辑漏洞的相关知识和技能&#xff0c;这里pikachu靶场作为演示进行学习一下&#xff1a; pikachu靶场&#xff1a;GitHub - zhuifengshaonianhanlu/pikachu: 一个好玩…

【Web】2024XYCTF题解(全)

目录 ezhttp ezmd5 warm up ezMake ez?Make εZ?мKε? 我是一个复读机 牢牢记住&#xff0c;逝者为大 ezRCE ezPOP ezSerialize ezClass pharme 连连看到底是连连什么看 ezLFI login give me flag baby_unserialize ezhttp 访问./robots.txt 继…