下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java反射高频面试题及答案(真实面试版)一、基础认知类(初级必问)1.什么是Java反射?核心作用是什么?答案:反射就是在程序运行阶段,动态获取一个类的完整信息(类名、属性、方法、构造器、注解等),并且可以直接操作对象的属性、调用方法、创建对象的机制。正常代码是编译期就确定调用哪个类、哪个方法,反射是运行期动态确定。核心用途:框架底层大量使用(SpringIOC、MyBatis、注解解析、动态代理、ORM映射),日常业务开发很少直接写反射。2.反射的源头是什么?Class类有什么特点?答案:反射所有操作的源头都是Class对象,每个被加载的类在JVM中只会有唯一的一个Class实例。Class类的特点:是所有类的根元数据类型,包含类的全部结构信息由JVM在类加载时自动创建,开发者不能newClass()基本数据类型、数组、接口、注解也有对应的Class对象3.获取Class对象的三种方式,以及各自使用场景?答案:类名.class:编译期已知类,效率最高,不会触发类的静态代码块执行对象.getClass():已有实例对象时使用,只能用于引用类型Class.forName("全类名"):运行期动态获取类(框架常用),会触发类加载、执行静态代码块实际开发框架中,基本上都是用Class.forName动态加载类。4.反射能操作哪些结构?哪些不能?答案:能操作:构造方法、普通方法、成员变量、静态变量、静态方法、注解、父类、接口、泛型信息。不能操作:局部变量(局部变量只在方法栈中存在,元数据不会被Class保存)。二、核心API与实操类(中级高频)5.说一下反射创建对象的两种方式?区别是什么?答案:clazz.newInstance()(JDK9废弃):只能调用无参空构造,如果类没有无参构造直接报错获取Constructor对象+newInstance(参数):可以调用有参构造、私有构造,通用性更强这也是为什么Spring、MyBatis要求实体类必须有无参构造,底层反射创建对象需要。6.反射如何获取/修改私有属性、调用私有方法?关键步骤是什么?答案:必须开启访问权限,核心代码setAccessible(true)。步骤:获取Class对象→获取对应Field/Method/Constructor→设置可访问→执行操作。注意:setAccessible(true)只是绕开Java语法权限检查,不是修改源码权限,且只对当前反射对象有效。7.Field、Method、Constructor各自的作用?答案:Field:对应类的成员变量,用来获取、修改字段值Method:对应类的方法,用来动态调用方法、获取方法参数/返回值/注解Constructor:对应构造方法,用来动态创建对象8.getMethod和getDeclaredMethod区别?(超高频)答案:getMethod:只能获取本类+父类的public公开方法,私有、保护、默认权限都拿不到getDeclaredMethod:只能获取当前本类所有权限方法(public/private/protected/default),拿不到父类方法Field、Constructor同理,带Declared的是获取本类所有权限,不带的是获取所有public。三、原理与优缺点类(面试加分项)9.反射的优缺点是什么?答案:优点:极大提升代码灵活性、扩展性,框架底层核心依赖运行期动态操作类,无需编译期绑定,适合通用工具、中间件开发缺点:性能差:反射需要解析元数据、绕过编译优化、权限校验,比直接调用慢很多破坏封装:可以强行修改私有属性、调用私有方法,违背面向对象封装特性编译期不校验:写错类名、方法名、参数,编译不报错,运行才抛异常代码可读性差、冗余繁琐10.为什么反射性能低?答案:编译期无法做静态优化,所有校验、绑定都在运行期完成需要频繁读取Class元数据、做权限校验方法调用不走常规调用栈,需要动态解析参数、装箱拆箱早期JDK反射无缓存,后续版本做了缓存优化,但依然比直接调用慢11.反射会不会触发类加载?静态代码块什么时候执行?答案:Class.forName()会触发类的初始化,执行静态代码块、静态变量赋值。类名.class只会加载、链接,不会触发初始化,静态代码块不执行。四、面试坑点&进阶问题(中高级必问)12.反射可以修改final修饰的变量吗?有什么坑?答案:普通成员变量的final,可以通过反射强行修改。常量(staticfinal基本类型/字符串)改不了,因为编译期会被常量折叠,代码中所有引用处都被直接替换成字面量,反射修改字段值也不会生效。13.反射操作泛型为什么需要Type而不是Class?答案:Java泛型存在擦除,运行期泛型信息会丢失,Class拿不到泛型参数。比如List<String>,运行期Class永远是List.class,所以需要用ParameterizedType解析泛型真实类型,Spring、MyBatis解析泛型参数都是这么做的。14.什么是反射暴力破解?开发中怎么规避风险?答案:通过setAccessible(true)强行访问私有结构,就是暴力反射,会破坏类的封装和安全性。规避:业务代码尽量不用反射;框架使用时通过权限校验、白名单限制反射调用范围;禁止反射修改核心敏感字段。15.JDK动态代理和反射的关系?答案:JDK动态代理底层完全依赖反射。InvocationHandler的invoke方法,就是通过反射执行目标对象的真实方法,这也是动态代理性能不如静态代理的核心原因。16.日常开发中,你在哪里用过反射?答案(面试标准口语版):业务代码基本不手写反射,因为性能差、可读性低。主要是框架底层依赖,工作中接触的场景:MyBatis反射封装数据库查询结果到实体类SpringIOC反射实例化Bean、注入属性自定义注解时,通过反射解析注解参数、做业务校验写通用工具类,比如对象拷贝、Excel导入导出字段映射,用反射统一处理字段赋值五、高频手写题(面试手撕)17.手写反射实现对象属性拷贝(简易版)解题思路:获取源对象、目标对象Class→遍历所有字段→开启访问权限
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环保法规变革解析
- 2026年安全知识考试题及答案
- 2026年办公耗材节约管控培训考核试题附答案
- 2026年中医耳鼻喉科学副高历年整套真题解析试题及答案
- 2026年公路工程施工安全员资格考试题库
- 2026年安全生产考试题库(含答案)
- 2026年班主任技能大赛发展心理学考点精练卷
- 2026年社区工作者招聘经济基础知识真题卷
- 2026年经济类联考数学一线性代数阶段测评卷
- 2026年安全培训考试题附答案
- 2026标准短视频拍摄合同律师审核修订版条款严谨权利义务对等公平合理可签
- 中国临床肿瘤学会(CSCO)胃癌诊疗指南(2026版)
- 有限空间作业监理实施细则(详细完-整版)
- 2026年烟花爆竹零售经营安全考试试题及答案
- T SCSIA 0015-2023《四川省信息化项目费用测算标准》
- 2026年产科急症多学科协作处置试题(含答案)
- 草原鼠虫害防治施工方案及技术措施
- 小学主题班会课件:语言表达
- 设备检维修作业风险识别培训课件
- 《决策树与智能推理》教学课件-2025-2026学年人教版初中信息技术(人工智能专册)
- 2026年春季开学“两案九制”完整文件,工作方案应急预案晨午检复课证明传染病防控健康教育消毒隔离制度等
评论
0/150
提交评论