首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
04-11 14:49
已编辑
广东轻工职业技术学院 Java
offer选择
1. 市属国企子公司软件研发岗,年包不到10w,公司在江苏三线城市,工作强度955,做的是海关等平台的系统开发,hr说进去之后再分前后端具体方向。2. 南京私企后端开发,年包15w,工作强度965,做的是司法法院信息化,公司规模在2000人左右。
如果可以选,你最想去哪家...
点赞
评论
收藏
分享
04-10 13:09
浙江大学 算法工程师
金山 C++ 一面 面经
1. 自我介绍简单做一下自我介绍,重点介绍自己的技术栈、做过的项目、项目中承担的职责,以及和 C++ 岗位相关的能力即可。回答时不需要铺得太开,控制在 1 分钟左右比较合适。参考回答:面试官您好,我是 XX,目前主要学习和使用的是 C++,系统学过 C++ 基础、数据结构、操作系统、计算机网络和数据库等内容。项目方面,我做过一个基于 C++ 的高并发服务端项目,也接触过多线程、网络编程、线程同步、内存管理等内容。在项目里我主要负责模块设计、接口实现和问题排查。今天也希望通过这次面试,和您交流一下我对 C++ 岗位相关知识的理解。2. 讲一下你做过的一个 C++ 项目,重点说你负责的部分参考回答...
C++八股文全集
点赞
评论
收藏
分享
03-05 20:42
门头沟学院 Java
27届java实习offer要不要接
小米oc了,但是在犹豫去不去。如果接受的话,小米正职待遇太差了,而且也不是互联网大厂,不确定这段经历对于秋招的背书有多大。算上餐补实习薪资5100,感觉太低了,并且岗位是中台开发,会干一些杂活,而且没有专门的mentor,和纯后端有一定区别。但是如果不接受的话,害怕接下来找不到好的offer,暑期0offer。图一是我简历上的项目和所学知识,图二是JD。实习的岗位不垂直,对秋招帮助大吗,该不该去,去了之后能胜任任务吗?
牛客29175002...:
实习的时候可以骑驴找马的,去小米两周就偷产出,然后在简历上写在小米2个月实习
实习想申请秋招offer...
点赞
评论
收藏
分享
04-03 23:26
门头沟学院 前端工程师
美团你到底在招什么人
🤡😭
好想睡觉到天荒地老:
这种感觉是员工注册来广撒网的
春招至今,你收到几个面试...
点赞
评论
收藏
分享
04-10 17:02
曲阜师范大学 Java
双非至今暑期无约面,简历筛终究不可战胜
简历有什么致命问题吗,字节投了60+没有通过一次简历筛
PMGao:
后端裁员很严重,aicoding时代了都,别搞java了
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
过来人聊聊对招商银行数字金融训练营的感受
4041
2
...
翼支付近两年真实体验
3931
3
...
美团前端考察AI coding出的题是周报生成?
2135
4
...
字节剪映123面全面经
1959
5
...
工作一年,聊聊对Agent开发的感受
1142
6
...
2026春招北京奈亚信息技术有限公司
1100
7
...
总拜倒在大厂二面是为什么啊。。。
1012
8
...
因为上班玩手机被开除😭
994
9
...
恒生电子一面只面了20min
744
10
...
灵犀互娱 游戏客户端开发 一面
656
创作者周榜
更多
正在热议
更多
#
父母问你工作找得怎么样,怎么回
#
8782次浏览
123人参与
#
面试被问期望薪资时该如何回答
#
389672次浏览
2176人参与
#
厦门银行科技岗值不值得投
#
19685次浏览
427人参与
#
哪些公司面试还在问八股?
#
4217次浏览
45人参与
#
想从事Agent应该学习哪些技术?
#
1808次浏览
58人参与
#
从投递到OC,你用了多久
#
8898次浏览
75人参与
#
你的秋招第一面感觉怎么样
#
146808次浏览
821人参与
#
有哪些公司在面试时考察AICoding?
#
3248次浏览
45人参与
#
什么人最适合大厂?
#
4418次浏览
40人参与
#
HR面都在聊什么?
#
3009次浏览
43人参与
#
AI时代还有必要刷leetcode吗?
#
1790次浏览
30人参与
#
你觉得机械有必要实习吗
#
82200次浏览
515人参与
#
哪一刻你突然觉得实习“有点值了”
#
7113次浏览
54人参与
#
一人一道大厂面试题
#
133835次浏览
1332人参与
#
kpi面有什么特征
#
106137次浏览
506人参与
#
硬件人的简历怎么写
#
341311次浏览
3120人参与
#
通信硬件2023笔面经
#
53742次浏览
322人参与
#
总结:哪家公司最喜欢泡池子
#
171854次浏览
620人参与
#
稳定和高薪机械人更看重哪个?
#
582498次浏览
5568人参与
#
四大天坑是哪四家?
#
113837次浏览
246人参与
#
计算机有哪些岗位值得去?
#
395459次浏览
2933人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务