首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
Mercuryleafer
华中科技大学 Java
关注
已关注
取消关注
m
@Java三段:
八股整理:说说反射的底层实现原理?
反射是 Java 面试中必问的面试题,但只有很少人能真正的理解“反射”并讲明白反射,更别说能说清楚它的底层实现原理了。所以本文就通过大白话的方式来系统的讲解一下反射,希望大家看完之后能真正的理解并掌握“反射”这项技术。1.什么是反射?反射在程序运行期间动态获取类和操纵类的一种技术。通过反射机制,可以在运行时动态地创建对象、调用方法、访问和修改属性,以及获取类的信息。2.反射的应用有哪些?反射在日常开发中使用的地方有很多,例如以下几个:动态代理:反射是动态代理的底层实现,即在运行时动态地创建代理对象,并拦截和增强方法调用。这常用于实现 AOP 功能,如日志记录、事务管理等。Bean 创建:Spring/Spring Boot 项目中,在项目启动时,创建的 Bean 对象就是通过反射来实现的。JDBC 连接:JDBC 中的 DriverManager 类通过反射加载并注册数据库驱动,这是 Java 数据库连接的标准做法。3.反射实现反射的关键实现方法有以下几个:得到类:Class.forName("类名")得到所有字段:getDeclaredFields()得到所有方法:getDeclaredMethods()得到构造方法:getDeclaredConstructor()得到实例:newInstance()调用方法:invoke()具体使用示例如下:// 1.反射得到对象Class<?> clazz = Class.forName("User");// 2.得到方法Method method = clazz.getDeclaredMethod("publicMethod");// 3.得到静态方法Method staticMethod = clazz.getDeclaredMethod("staticMethod");// 4.执行静态方法staticMethod.invoke(clazz);反射执行私有方法代码实现如下:// 1.反射得到对象Class<?> clazz = Class.forName("User");// 2.得到私有方法Method privateMethod = clazz.getDeclaredMethod("privateMethod");// 3.设置私有方法可访问privateMethod.setAccessible(true);// 4.得到实例Object user = clazz.getDeclaredConstructor().newInstance();// 5.执行私有方法privateMethod.invoke(user);4.底层实现原理从上述内容可以看出,对于反射来说,操纵类最主要的方法是 invoke,所以搞懂了 invoke 方法的实现,也就搞定了反射的底层实现原理了。invoke 方法的执行流程如下:查找方法:当通过 java.lang.reflect.Method 对象调用 invoke 方法时,Java 虚拟机(JVM)首先确认该方法是否存在并可以访问。这包括检查方法的访问权限、方法签名是否匹配等。安全检查:如果方法是私有的或受保护的,还需要进行访问权限的安全检查。如果当前调用者没有足够的权限访问这个方法,将抛出 IllegalAccessException。参数转换和适配:invoke 方法接受一个对象实例和一组参数,需要将这些参数转换成对应方法签名所需要的类型,并且进行必要的类型检查和装箱拆箱操作。方法调用:对于非私有方法,Java 反射实际上是通过 JNI(Java Native Interface,Java 本地接口)调用到 JVM 内部的 native 方法,例如 java.lang.reflect.Method.invoke0()。这个 native 方法负责完成真正的动态方法调用。对于 Java 方法,JVM 会通过方法表、虚方法表(vtable)进行查找和调用;对于非虚方法或者静态方法,JVM 会直接调用相应的方法实现。异常处理:在执行方法的过程中,如果出现任何异常,JVM 会捕获并将异常包装成 InvocationTargetException 抛出,应用程序可以通过这个异常获取到原始异常信息。返回结果:如果方法正常执行完毕,invoke 方法会返回方法的执行结果,或者如果方法返回类型是 void,则不返回任何值。通过这种方式,Java 反射的 invoke 方法能够打破编译时的绑定,实现运行时动态调用对象的方法,提供了极大的灵活性,但也带来了运行时性能损耗和安全隐患(如破坏封装性、违反访问控制等)。5.优缺点分析反射的优点如下:灵活性:使用反射可以在运行时动态加载类,而不需要在编译时就将类加载到程序中。这对于需要动态扩展程序功能的情况非常有用。可扩展性:使用反射可以使程序更加灵活和可扩展,同时也可以提高程序的可维护性和可测试性。实现更多功能:许多框架都使用反射来实现自动化配置和依赖注入等功能。例如,Spring 框架就使用反射来实现依赖注入。反射的缺点如下:性能问题:使用反射会带来一定的性能问题,因为反射需要在运行时动态获取类的信息,这比在编译时就获取信息要慢。安全问题:使用反射可以访问和修改类的字段和方法,这可能会导致安全问题。因此,在使用反射时需要格外小心,确保不会对程序的安全性造成影响。课后思考为什么反射的执行效率比较低?动态代理的实现除了反射之外,还有没有其他的实现方法?参考 & 鸣谢javacn.site
点赞 6
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
12-17 12:16
叮咚买菜_咚力生(管理方向)(准入职员工)
叮咚买菜内推,叮咚买菜内推码
📍 工作地点:在上海市浦东新区叮咚买菜总部,我入职时正好赶上换新办公楼,搬到张江之门啦,新环境新工位,想想就超开心🥳 附近租房价格也比较合理,没有市中心那么夸张。 📝 工作内容:类似采购,但在采购基础上赋予了更大的想象和职能。不再是传统的搬货采购模式,而是要根据消费者需求精准开发产品,全程负责到底。 这边以生鲜为例子:比如帮助一些因各种原因被雪藏的特色生鲜水果走出当地,推广到更多的地方,让消费者尝到美味的特色生鲜水果的同时带动当地的农牧民共同致富💰 例如:大凉山丑苹果,通过以离太阳更近离城市更远,天然无污染为卖点开发出的产品。霜冻菜以抗寒植物在寒冷条件下提升细胞渗透压将淀粉转化为糖的原...
点赞
评论
收藏
分享
昨天 20:18
小米_技术委_大模型算法工程师
内推|小米|校招|社招|实习|内推码4Q6GKUB
base多样北京、上海、武汉、南京、深圳等多地有招聘需求;校招、社招和实习皆可使用内推码。内推投递方式简单内推码投递:在投递简历时,填写内推码 4Q6GKUB,即可享受内推专属通道,让你的简历更快被HR看到。校招链接投递:直接点击投递链接:https://xiaomi.jobs.f.mioffice.cn/referral/campus/position?token=MzsxNzQyNTU0MDYxNTgyOzczNzQ1Mzg3NzA4Mjc0Mjc5NDg7MA社招链接投递:直接点击投递链接:https://xiaomi.jobs.f.mioffice.cn/referral/positi...
投递小米集团等公司6个岗位
点赞
评论
收藏
分享
不愿透露姓名的神秘牛友
12-17 17:40
27届找实习求锐评简历
27届求锐评简历,日常实习约不到面有点无奈了
Java和苟一桌:
哈✌🏻直接投就完了 首行加大加粗😡
实习简历求拷打
点赞
评论
收藏
分享
12-19 14:23
已编辑
西安飞机工业公司职工工学院 算法工程师
offer帮选
只能实习三个月,主要是备战春招,。百度智能云——自进化Agent研究+落地,组内产出FMAgent,250r高德Agent业务向,智能助手,偏业务网易研究院大模型算法500r,组内方向不明确,近期产出子曰3
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
读研还是本科就业?
1969
2
...
用了几年 AI 辅助编程,发现自己逐渐废了,我该怎么办
1681
3
...
数字马力
1539
4
...
双非硕后端秋招情况(准备春招版)
1208
5
...
给26届校招拿到大厂Offer的人一句忠告!
1160
6
...
牛爷爷们帮忙选一下offer
954
7
...
秋招总结
899
8
...
美团一面凉经
840
9
...
腾讯云智timeline
834
10
...
任何人都可以拥有的超优秀实习经历
828
创作者周榜
更多
正在热议
更多
#
2025年终总结
#
124141次浏览
2083人参与
#
实习简历求拷打
#
16897次浏览
194人参与
#
作业帮求职进展汇总
#
84089次浏览
554人参与
#
秋招被挂春招仍然能投的公司
#
7913次浏览
108人参与
#
实习要如何选择和准备?
#
128589次浏览
1486人参与
#
外包能不能当跳板?
#
54331次浏览
256人参与
#
诺瓦星云求职进展汇总
#
233578次浏览
1736人参与
#
mt对你说过最有启发的一句话
#
39216次浏览
454人参与
#
公司情报交流地
#
126742次浏览
1227人参与
#
为了找工作你花了哪些钱?
#
74915次浏览
361人参与
#
你觉得机械有必要实习吗
#
69866次浏览
485人参与
#
投格力的你,拿到offer了吗?
#
153484次浏览
822人参与
#
一起聊美团
#
307754次浏览
1767人参与
#
什么是优秀的实习经历
#
9466次浏览
226人参与
#
摸鱼被leader发现了怎么办
#
104038次浏览
659人参与
#
京东开奖
#
632126次浏览
3180人参与
#
秋招特别不鸣谢
#
16737次浏览
186人参与
#
考研失败就一定是坏事吗?
#
202732次浏览
1389人参与
#
选实习,你更看重哪方面?
#
15409次浏览
230人参与
#
安克创新求职进展汇总
#
62500次浏览
541人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务