首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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-05 20:22
武汉大学 Java
20251205【字节】面试算法真题(共2题)
题目1:奇数筛选与字典构建题目2:字符串筛选与集合去重
点赞
评论
收藏
分享
12-04 09:48
门头沟学院 客户端其它
翘课去实习的那些人后来怎么样了
我是码农索隆,我赞成牛友翘课去实习。现在这个卷学历、卷实习、卷技术的时代算是让我们摊上了,也算是赶上好时候了~老话说:“纸上学来终觉浅,绝知此事要躬行”,你看老祖宗都告诉咱们,学了知识之后,要亲自尝试,所以实习这个事是没毛病的,但是,翘课实习,就要考虑怎么护住毕业证这个大事。我分享几个保护毕业证的好方法。一、别玩彻底消失。课全旷、人失踪,这是不对推荐的,也是不理智的,这会导致导员跳脚,直接拿着毕业证威胁你让你回校。靠谱做法是:提前找好代课,作业一次别落,平时分挣满,期末准时赴考。至于查寝,室友的掩护必须打好。二、旷课实习被发现。这个不用慌,我推荐的做法是给父母打个电话,和父母详细阐述一下这个事...
码农索隆:
翘课不去实习,那干嘛去了
为了去实习,我赌上了__...
点赞
评论
收藏
分享
11-16 20:07
门头沟学院 Java
大三,双非,想实习,求建议
大一、大二傻傻的,一直跟着学校走,今年7月初刷到优雅的视频才开始醒悟。学到了微服务、rocketmq,优雅的入门路线只有jvm没看,其他看完了,跟敲了点评和外卖。最近一直在背八股(redis一点没看、jvm、juc没看完、javase、集合、mysql看完了)、准备项目。项目真的不知道要怎么学,感觉自己学得很浅、很表面,不知道学到什么程度才能去面试,有必要把代码抄一遍吗?我也想进步,想进中大厂,想秋招拿offer
在看牛客的铁锤很谦虚:
这个学校在牛客还是挺多的hh
点赞
评论
收藏
分享
12-06 16:17
济宁学院 Java
27java准备找实习 大家有什么建议吗
点赞
评论
收藏
分享
12-06 22:12
武汉大学 Java
20251206【科大讯飞】笔试算法真题(共3题)
题目1:细菌生命周期查询题目2:大小写切换最大化题目3:符阵分割最大能量
投递科大讯飞等公司6个岗位
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
零经验也能斩获实习offer
7912
2
...
百度网盘Golang开发一面凉经
4928
数字马力交流圈
热聊中
3
...
小红书26校招Java二面85min
4633
4
...
这环境。。。我来谈谈选择和长期主义
4062
华为进展交流圈
热聊中
5
...
0实习冲明年前端暑期,要不要找寒假实习?
4039
6
...
工作两年裸辞读研,我后悔了吗···
3164
7
...
亲戚一张嘴,离职变丑闻
2312
8
...
手子入职第二天
2165
9
...
招转培啥时候能被治理
2163
10
...
成都java小厂 日常实习一面面经 25min
2117
创作者周榜
更多
正在热议
更多
#
找工作能把i人逼成什么样
#
4919次浏览
50人参与
#
面试尴尬现场
#
198710次浏览
753人参与
#
百融云创求职进展汇总
#
22319次浏览
145人参与
#
0经验如何找实习?
#
15126次浏览
297人参与
#
最难的技术面是哪家公司?
#
60081次浏览
937人参与
#
你今年做了几份实习?
#
4451次浏览
66人参与
#
腾讯音乐求职进展汇总
#
142984次浏览
1032人参与
#
字节出了豆包coding模型
#
4552次浏览
49人参与
#
你找工作经历过哪些骗局?
#
5588次浏览
100人参与
#
实习心态崩了
#
93804次浏览
487人参与
#
你开始找寒假实习了吗?
#
8568次浏览
135人参与
#
实习越久越好,还是多多益善?
#
11679次浏览
98人参与
#
25年找工作是什么难度?
#
8143次浏览
89人参与
#
一上班就想____,这正常吗?
#
2856次浏览
62人参与
#
刚工作,应该先搞钱or搞成长?
#
4620次浏览
67人参与
#
离职你会和父母说吗?
#
6267次浏览
86人参与
#
你投了多少家公司?进展是___
#
183364次浏览
1135人参与
#
如果公司降薪,你会跳槽吗?
#
109273次浏览
687人参与
#
实习必须要去大厂吗?
#
168328次浏览
1660人参与
#
你是怎么和mt相处的?
#
82502次浏览
436人参与
#
你会为了工作牺牲生活吗?
#
65039次浏览
446人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务