首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
05-26 16:31
北京联合大学 测试工程师
【北京求职】别死磕大厂了,这家技术公司真的在“认真做事”
最近在北京面了一圈,越面越清醒:大厂看着光鲜,可进去之后大多是重复劳动、流程冗长、晋升看年限,想做点有成就感的事反而很难;小公司又参差不齐,要么管理混乱,要么老板画饼,干几个月就散伙的也不少。踩过几家坑之后,终于遇到一家让我愿意留下来长期干的科技公司:中思创新(北京)科技有限公司。不是广告,纯个人求职体验,给同样在找技术岗的朋友一个真实参考。我最在意的,从来不是公司多大,而是能不能学到东西、氛围舒不舒服、值不值得长期投入。这家公司,刚好踩中了所有我想要的点。氛围:没有虚的,大家都在认真解决问题一进公司就能感觉到,这里没有职场表演。不搞早会晚会打卡文化,不搞无意义汇报,不搞上下级那套。领导和工程...
点赞
评论
收藏
分享
05-27 18:43
已编辑
黑龙江大学 Java
我可能就是大家口中的"工贼"
一、什么是"工贼"在牛客或者各种打工人聚集的论坛上,"工贼"是一个有点黑色幽默的词。它最早是从工人运动里来的——指那些在罢工期间还继续上工、破坏集体行动的人。被搬到互联网行业之后,它变成了另一种含义:那些主动加班的人,那些不到点不下班的人,那些周末还在写技术博客的人,那些 mentor 没安排活也要主动找活的人,那些在公司里争取更多权限和责任的人,那些下班回家还在跑 demo 的人。简单说,工贼就是那些"明明可以摸鱼但偏偏要卷"的人。在很多人的叙事里,工贼破坏的是行业的"打工人共识"——大家本来可以一起准点下班、一...
小软-kiki(软可...:
没有天生想卷的人,只有被迫努力的普通人。专升本 + 双非硕一路逆袭,你真的已经很厉害了
点赞
评论
收藏
分享
05-09 12:10
济宁学院 Java
简历写成这样能找到实习吗,双非大三
程序员小白条:
丰富下简历,有点少了,中小厂反正看运气海投
点赞
评论
收藏
分享
05-20 16:51
东南大学 C++
写简历也可以vibe coding了???
开源了一个新的项目,可以让你像vibe coding一样编辑你的简历:VibeResume 是一个 AI 友好、可导出 PDF 的简历模板。你不需要在 Word、LaTeX 或浏览器打印预览里反复对齐版式;把简历维护成 HTML + CSS,让 AI 帮你改内容和排版,然后用脚本把网页看到的布局稳定导出成一页 PDF。此前我们已开源过寻找项目、进行项目优化、简历优化的工具,本次开源的 VibeResume 负责最后一公里:把简历内容维护成漂亮网页,并稳定导出 PDF,让你像 vibe coding 一样编辑你的简历!项目开源在https://github.com/LiuMengxuan04/vibe-resume如果对你有帮助的话,求star!也欢迎pr&amp;issues!
想去华为了:
终于不用半夜调LaTeX边距了
如何写一份好简历
点赞
评论
收藏
分享
05-26 20:29
已编辑
上海大学 算法工程师
一人一单问题 锁相关
一、最开始的问题(为什么不加锁不行?)你最开始的代码是这样:java运行 public Result createVoucherOrder(Long voucherId) { // 查询是否买过 int count = query().eq("user_id", userId).eq("voucher_id", voucherId).count(); if (count > 0) { return 已买过; } // 扣库存 // 创建订单 } 高并发下会发生什么灾难?两个线程同时进来:线程 A:查 → 没买过线程 B:查 → 没买过两个线程同时通...
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
27届暑期前端高频面试题汇总(字节百度阿里快手等多家大厂)
6058
2
...
字节三面
3188
3
...
美团计划裁员30%,测试和产品砍一半,测试全栈化时代来了!
2019
4
...
26前端的深夜
1441
5
...
你说你用Claude,你用的是 CLI,还是 Agent、Opus?
1211
6
...
字节实习一个月祛魅了
1058
7
...
继续实习VS暑假沉淀,怎么选....
1053
8
...
今天陌陌的笔试怎么样
1026
9
...
收到了字节的AIoffer
911
10
...
xdm,开发投麻了,顺手试试投了测试,但是又有点犹豫1. 如果干了测试,以后找正式的开发是不是会更难?(没到万不得已,我还是想走开发)2. 合同签一年,这个会不会太久了?值得一去吗?给点建议#实习,不
623
创作者周榜
更多
正在热议
更多
#
27届实习投递记录
#
170336次浏览
1700人参与
#
拼多多工作体验
#
68419次浏览
463人参与
#
求职遇到的搞笑事件
#
200526次浏览
1015人参与
#
国庆前的秋招小结
#
305173次浏览
1758人参与
#
体制内上岸心路历程
#
39685次浏览
226人参与
#
得物app工作体验
#
71225次浏览
125人参与
#
AI时代下,你的岗位要求有什么变化?
#
43353次浏览
290人参与
#
万物皆可发面经
#
6841次浏览
82人参与
#
扒一扒那些奇葩实习经历
#
161360次浏览
1185人参与
#
26届校招投递进展
#
684071次浏览
3970人参与
#
今年找实习到底有多难?
#
109657次浏览
501人参与
#
你见过最离谱的招聘要求是什么?
#
286689次浏览
1902人参与
#
实习,不懂就问
#
234119次浏览
1777人参与
#
产品面经
#
302312次浏览
2224人参与
#
选择和努力,哪个更重要?
#
221474次浏览
1602人参与
#
招聘要求与实际实习内容不符怎么办
#
227427次浏览
1078人参与
#
实习生的蛐蛐区
#
1014749次浏览
5175人参与
#
担心入职之后被发现很菜怎么办
#
308527次浏览
1228人参与
#
满分简历要如何准备?
#
322883次浏览
3384人参与
#
参加过提前批的机械人,你们还参加秋招么
#
123323次浏览
1698人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务