下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java反射高频面试题(真实面试版)一、基础认知类(初级必问)1.什么是Java反射?核心作用是什么?参考答案:反射是Java语言的一种机制,允许程序在运行期间获取类的完整信息,并且可以直接操作类的属性、方法、构造器,不需要在编译期明确知道类的具体类型。简单说:编译期不知道的类,运行期可以动态拿到并使用。核心作用:动态创建对象、调用方法、修改属性实现框架的底层适配(Spring、MyBatis、JUnit核心底层都是反射)实现通用工具类、序列化、动态配置加载2.Class对象的三种获取方式?日常开发最常用哪种?参考答案:三种获取Class字节码对象的方式:类名.class:静态获取,编译期即可获取,不触发类加载对象.getClass():实例对象获取,只能用于已实例化对象Class.forName("全类名"):动态加载类,会触发类的静态代码块执行日常开发框架底层最常用:Class.forName(),适合根据配置文件动态加载未知类。3.说说反射中Class、Field、Method、Constructor的作用参考答案:Class:代表类的字节码对象,是反射的入口,存储类的所有全局信息Field:对应类的成员变量,可实现取值、赋值操作Method:对应类的方法,可实现动态调用方法Constructor:对应类的构造方法,可动态创建对象实例4.反射能不能操作私有属性和私有方法?怎么做?参考答案:可以操作。Java的访问修饰符是编译期校验,反射是运行期机制,可以绕过编译期权限校验。核心代码:setAccessible(true)该方法的作用是关闭Java的权限检查,允许读写private、protected、default权限的属性和方法。注意:即使是私有构造器,开启可访问权限后也能创建对象。二、原理与类加载类(中级高频)5.类名.class和Class.forName()的核心区别?参考答案:类名.class:只是获取字节码对象,不会触发类的初始化,静态代码块、静态变量赋值都不会执行,效率更高Class.forName():会执行类加载的全过程(加载、链接、初始化),一定会执行静态代码块经典场景:JDBC驱动注册为什么用Class.forName()?因为驱动类的注册逻辑写在静态代码块中,必须触发类初始化才能完成驱动注册。6.反射创建对象的两种方式及区别参考答案:clazz.newInstance()(JDK9已废弃)获取无参构造器newInstance()(主流写法)区别:旧的clazz.newInstance()只能调用无参、空参构造器,如果类没有无参构造直接报错通过Constructor创建对象,可以指定有参构造器,适配性更强,也是现在框架统一使用的方式核心结论:反射创建对象,类必须保证有无参构造(除非指定有参构造),这也是Spring实体类、Bean要求无参构造的核心原因。7.什么是泛型擦除?反射为什么能突破泛型限制?参考答案:Java泛型是编译期语法糖,在编译完成后,字节码中会抹去泛型信息,这个过程就是泛型擦除,运行期集合是没有泛型类型限制的。反射是运行期操作,直接操作字节码,不受编译期泛型校验约束。经典案例:可以通过反射向List<String>中添加Integer类型数据,运行期不会报错。三、优缺点与性能问题(面试必问亮点)8.反射的优缺点分别是什么?参考答案:优点:灵活性极高,实现动态编程,解耦代码是主流框架的底层基石(SpringIOC、AOP、MyBatis映射)可以绕过编译期限制,实现常规代码做不到的功能缺点:性能差:反射需要解析字节码、做权限校验,比直接调用慢很多破坏封装性:可以强行修改私有属性、调用私有方法,违背面向对象封装特性代码可读性差、繁琐,硬编码多,容易出问题存在安全风险,可绕过权限控制篡改类内部数据9.反射为什么慢?如何优化反射性能?参考答案:慢的核心原因:运行期动态解析字节码文件,获取类、方法、属性信息每次调用都需要做权限校验、参数校验无法触发JIT编译优化,常规代码的编译优化对反射无效性能优化方案:缓存反射对象:将Class、Method、Field对象提前缓存,避免每次重复获取提前开启setAccessible(true),关闭重复权限校验使用JDK原生反射工具类(MethodHandle),效率接近直接调用高频场景使用字节码框架替代反射(CGLIB、ASM)四、实操坑点与场景题(进阶加分)10.反射修改final修饰的静态变量和成员变量,有什么区别?参考答案:final普通成员变量:反射可以直接修改值,生效final静态常量(基本类型/字符串常量):修改无效,因为编译期会被常量折叠,代码中所有使用该常量的地方都会被替换成字面量总结:静态final常量无法通过反射修改生效,普通final变量可以修改。11.说说反射在你项目/框架中的实际应用场景参考答案(面试通用话术):日常开发中不会直接大量写反射代码,但底层框架全程依赖:SpringIOC:通过反射扫描注解、动态创建Bean对象、依赖注入,无需手动new对象MyBatis:通过反射封装数据库查询结果到实体类对象,动态调用Mapper接口方法JUnit单元测试:通过反射执行@Test注解的测试方法自定义工具类:项目中写过实体类参数拷贝、对象属性对比工具,通过反射遍历所有属性,避免重复get/set代码12.反射会导致什么问题?生产环境有什么注意点?参考答案:常见问题:性能损耗,高频接口滥用反射会导致接口响应变慢破坏封装,容易修改内部私有状态,引发隐蔽bug编译期不报错,所有异常都是运行期异常,排查难度大生产注意点:非必要不手写反射,优先使用工具类(SpringBeanUtils、Hutool工具类)反射对象统一缓存,避免频繁创建谨慎操作私有属性和final变量,避免业务数据异常五、冷门进阶面试题(大厂深挖)13.什么是反射暴漏?如何避免?参考答案:反射暴露就是通过反射获取并修改类的私有属性、内部状态,破坏了类的封装设计,导致类内部逻辑不可控。避免方式:自定义类尽量私有化内部属性,提供规范的get/set方法核心业务字段禁止外部反射修改高版本JDK提供
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年华夏银行信贷审批校招笔试模拟试卷及答案
- 司法考试刑事诉讼法试题及答案
- 2026年农产品质量安全检测物联网应用模拟试卷及答案
- 2027年律师执业考试刑法总则通关试卷
- 2026年农村信用社招聘经济学基础黄金预测卷
- 2026年法律顾问考试青少年社会工作预测试卷
- 2026年安全生产管理考试试题及答案
- 2026年巴中市巴州区网格员考试题库(含答案)
- 2026年安庆市迎江区社区网格员招录考试真题库及完整答案
- 初中语文八年级教学设计:从细节处读懂鲁迅的人格温度-《回忆鲁迅先生》课堂实录与深度解读
- 大象版六年级心理健康教育全册教案
- 浙教版小学劳动六年级《项目一创意改造提效率-劳动工具的改进》教案
- 2023 年 5 月全国事业单位联考 C 类《综合应 用能力》及参考答案
- 坐标纸(A4纸直接打印就可用)
- 物理化学第九章-胶体化学
- 03第三章-林分结构Y课件
- 兽医流行病学 第七章 描述流行病学
- 疏浚工程概预算编制规定
- LY/T 2749-2016桉树速丰林配方施肥技术规程
- GB/T 18214.1-2000全球导航卫星系统(GNSS)第1部分:全球定位系统(GPS)接收设备性能标准、测试方法和要求的测试结果
- GB/T 18102-2000浸渍纸层压木质地板
评论
0/150
提交评论