首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
06-23 17:28
重庆大学 C++
碰到这样mentor/leader算是完了
在大群里问你为什么周末不回消息距离下班还有20min告诉你有个急活并且必须今天弄完没有正向反馈稍微问下问题就嫌烦 嫌你笨看见你了假装没看见/从来不和你主动打招呼讲话讲不清楚,做完了跟你说:不是这样的组里团建/吃饭从来不叫你第一天来不主动把你介绍给组里其他人 默默扮演了一周的空气丢给你一个sop/文档就不管了 让你一个人问东问西你找他消息永远半个多小时之后才回 他找你动不动告诉你很急,希望你快点弄好不回复你的消息or故意隔很久很久再回欢迎补充……
柠檬精深藏功与名:
这种真的宝宝你信我立刻离职,马不停蹄离职,不要担心你离职了以后回不来这家公司,实习不会卡的
实习最想跑路的瞬间
点赞
评论
收藏
分享
06-20 21:45
陕西师范大学 Java
不想秋招
只有我一个人这样想的吗 暑期实习就很累了 秋招又开始了 不想刷leetcode,不想背八股
码客明:
撑住这个最艰难的时刻,秋招完了然后好好休息一下
点赞
评论
收藏
分享
04-28 20:53
已编辑
山西大学 C++
现在是大一,暑假想找个实习,这简历能找到吗?
某双一流大学。技能点全点在算法了,五月应该能打下来icpc和CCPC的牌子,蓝桥杯大概能打个国奖。准备保研,学校保研压力不是很大,暑假想找个实习拓展一下经历。目标方向是游戏开发(大概率)或者人工智能(小概率)。目前几乎0开发经验,2月开学的时候稍微学了三天前端做过一个导航页,技术力之低应该算不上开发经验。如果想找到一个游戏厂的实习,现在应该怎么点技能点?
他们朝我扔粑粑我拿粑粑做蛋挞:
以你的基础,把6.S081刷完就能当一个操作系统项目去面日常了,再刷个CS144做个协议栈当小项目,实习产出还可以包装,不是哥们大一你着急什么,把CS基础学个通透沉淀沉淀大二秒杀大厂日常了,你现在找一些中小对你也没提升说实话
实习,投递多份简历没人回复怎么办
点赞
评论
收藏
分享
05-22 09:23
门头沟学院 Java
收到了自称是字节的邮件,是不是真的
如图。有类似情况的大佬吗,怕是钓鱼邮件还没敢点开 发件人显示为字节跳动招聘 • **********
我是晴仔呀:
看邮件结尾,如果整个邮件是某某@bytedance.com 就是真的,如果其他大概率是假的
字节跳动工作体验
字节求职进展汇总
点赞
评论
收藏
分享
06-20 19:45
门头沟学院 硬件开发
谁懂看到这种内容就想吐
好在哪里了?我请问了?
仁者伍敌:
活着的人都说好,帮我盖上棺材盖谢谢
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
秋招就投这些了
3.7W
2
...
AI应用面试题
3.2W
3
...
不懂“心眼子”会吃大亏!测测你的心眼子能拿几分?
2.2W
4
...
26届各互联网厂开启秋招时间线汇总
1.1W
5
...
求助!如何拒绝同个小区的同事蹭车?
8326
6
...
女友爸爸帮我花钱找了工作,我爸妈觉得应该的
3431
7
...
暑期实习后发现自己不适合大厂
3091
8
...
这后端是真不想干了,节子实习浅谈
2796
9
...
看看你是不是亲生的
2703
10
...
最emo的一天
2701
创作者周榜
更多
正在热议
更多
#
26届校招投递进展
#
4507次浏览
68人参与
#
2023届毁约公司名单
#
197888次浏览
954人参与
#
为了找工作你花了哪些钱?
#
16543次浏览
143人参与
#
你秋招想去哪些公司
#
6386次浏览
383人参与
#
第一份工作能做外包吗?
#
16244次浏览
195人参与
#
选完offer后,你后悔学机械吗?
#
30483次浏览
172人参与
#
你今年的平均薪资是多少?
#
128673次浏览
670人参与
#
你都遇到过哪些离谱的求职经历
#
11121次浏览
36人参与
#
分享一个让你热爱工作的瞬间
#
28855次浏览
307人参与
#
电信求职进展汇总
#
10098次浏览
85人参与
#
制造业的秋招小结
#
90317次浏览
1628人参与
#
你见过最离谱的招聘要求是什么?
#
195484次浏览
1456人参与
#
作业帮求职进展汇总
#
53844次浏览
362人参与
#
应届生进小公司有什么影响吗
#
74805次浏览
1019人参与
#
为什么那么多公司毁约
#
175326次浏览
1327人参与
#
如果实习可以转正,你会不会放弃秋招
#
520706次浏览
4527人参与
#
实习期间如何提升留用概率?
#
94169次浏览
1145人参与
#
应届生应该先就业还是先择业
#
110551次浏览
643人参与
#
非技术岗薪资爆料
#
369161次浏览
2771人参与
#
参加完秋招的机械人,还参加春招吗?
#
50851次浏览
553人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务