首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
07-12 15:56
上海智元新创技术有限公司_产品经理(准入职员工)
智元机器人内推
来到智元快一个月了,更新一下实习体验 4.实习感受:mentor太好了每次我做的任务他都会给反馈,有问题会教我怎么做,做的不错的就会点赞工作是弹性制8小时,上午9:30前上班的话,晚上7:00就可以打卡下班了,我基本没有在晚上或者周末加过班,因为mentor分配的任务很合理。公司也会有晚上的披萨小吃,圣诞节下午茶,赞 5.稚晖君太低调了,我只有在挤电梯的时候看见过他在我背后,还没能说上话,希望年会能有机会要到合影智元机器人【人形机器人头部企业】2026届暑期实习生招募正式启动智元机器人(Agibot)成立于2023年2月,是一家专注于AI与机器人融合创新的高科技企业,致力于打造通用人形机器人和...
智元机器人公司福利 54人发布
点赞
评论
收藏
分享
05-22 09:23
门头沟学院 Java
收到了自称是字节的邮件,是不是真的
如图。有类似情况的大佬吗,怕是钓鱼邮件还没敢点开发件人显示为字节跳动招聘 • **********
我是晴仔呀:
看邮件结尾,如果整个邮件是某某@bytedance.com 就是真的,如果其他大概率是假的
字节跳动工作体验
点赞
评论
收藏
分享
06-12 17:08
天津理工大学 Java
求大佬点评简历,刚开始投好焦虑
27届双非,第一次投简历😭😭😭
想按时下班的大菠萝在...:
隔壁学校的,加油多投, 实在不好找可以下个学期开学找,把算法八股准备好,项目有空再换换
投了多少份简历才上岸
点赞
评论
收藏
分享
07-11 14:52
已编辑
武夷学院 前端工程师
字节前端日常实习一面
日常实习的面会比较简单一点Vue的响应式原理 ?响应式具体到是如何的呢?Vue3对比Vue2在响应式方面优化了什么?跨域问题是什么 怎么遇到的 都有哪些解决方法有哪些实现元素垂直居中的方法?然后问项目:什么项目遇到了难点?I18N是如何实现的?I18N是有静态数据和动态数据 为什么会这样?Vue的虚拟滚动组件库原理?SEO是如何实现的?然后手写代码:手写通用的防抖和节流感觉很多地方他想问我库的实现原理和源码,我都含糊过去了
查看12道真题和解析
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
关于项目烂大街的那些事
8946
2
...
0实习0面试, 速通拼多多
7058
3
...
秋招公司情报局,分享线索得牛币💰
6915
4
...
秋招腾讯TEG提前批(三面挂)
6772
5
...
后端实习到底该干什么啊
5067
6
...
从外包到正式工,从Java开发到私有云运维:我的职场逆袭之路
4159
7
...
明天五场面试,加油
3278
8
...
王侯将相宁有种乎!
2857
9
...
我和妈妈讲以后我可能给不了她一个月1500
2765
10
...
从互联网“逃”到车企,我找到了理想工作!应届生选车企真香?
2352
创作者周榜
更多
正在热议
更多
#
26届的你们有几段实习?
#
19506次浏览
273人参与
#
你小时候最想从事什么职业
#
102701次浏览
1771人参与
#
你被哪些公司秒挂过?
#
18582次浏览
182人参与
#
网申一定要掌握的小技巧
#
9641次浏览
65人参与
#
如何提高实习转正率?
#
7523次浏览
133人参与
#
新凯来求职进展汇总
#
41012次浏览
108人参与
#
你认为哪些项目算烂大街?
#
8246次浏览
196人参与
#
机械校招之路总结
#
92413次浏览
1889人参与
#
你后悔自己读研吗?
#
8896次浏览
175人参与
#
你以为的实习VS真实的实习
#
11427次浏览
131人参与
#
月薪多少能在一线城市生存
#
10668次浏览
169人参与
#
腾讯工作体验
#
479907次浏览
3498人参与
#
找工作时的取与舍
#
81311次浏览
577人参与
#
最难的技术面是哪家公司?
#
5915次浏览
57人参与
#
秋招拿一个offer可以躺平吗
#
144941次浏览
928人参与
#
安利/避雷我的专业
#
77737次浏览
526人参与
#
面试等了一周没回复,还有戏吗
#
137172次浏览
1229人参与
#
你想留在一线还是回老家?
#
50029次浏览
513人参与
#
选择和努力,哪个更重要?
#
86053次浏览
745人参与
#
当下环境,你会继续卷互联网,还是看其他行业机会
#
114913次浏览
799人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务