- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Java反射面试题及答案
1.什么是Java反射?实际开发中为什么要用到它?
答案:
简单说,反射就是程序运行时能动态获取类的结构(比如字段、方法、构造器),还能操作这些成员的能力——不用在编译时就确定要操作哪个类。
实际开发用它,核心是为了“动态性”。比如框架开发时,没法提前知道用户会定义什么类:像Spring的IOC容器,读取配置文件里的类名(比如com.xxx.User),就得用反射动态创建Bean;MyBatis映射POJO时,也得靠反射给私有字段赋值;还有自定义注解解析,比如用@Controller标注类后,框架要通过反射找到这些类并初始化。
2.获取Class对象有哪几种方式?它们的区别和适用场景是什么?
答案:
共3种核心方式,区别主要在“获取时机”和“是否依赖实例”:
//方式1:类名.class→编译时确定,无需实例,无异常
ClassUserclazz1=User.class;
//场景:已知具体类,比如工具类里固定操作某个类时用
//方式2:对象.getClass()→运行时确定,必须先有实例
Useruser=newUser();
Class?extendsUserclazz2=user.getClass();
//场景:已有对象实例,想动态获取它的类信息(比如多态场景)
//方式3:Class.forName(全类名)→动态加载,需处理ClassNotFoundException
try{
Class?clazz3=Class.forName(com.example.demo.User);
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}
//场景:类名不确定,需要从配置/数据库读取(比如加载MySQL驱动:Class.forName(com.mysql.cj.jdbc.Driver))
3.反射创建对象有两种常用方式,它们的区别是什么?为什么newInstance()会过时?
答案:
两种方式核心是“是否依赖构造器”:
Class对象的newInstance():
只能调用类的无参构造器,且要求无参构造器是可访问的(比如public)。
Useruser=User.class.newInstance();//已过时
过时原因:如果无参构造器不存在/不可访问,会直接抛InstantiationException或IllegalAccessException,异常类型不够具体;而且没法调用带参构造器。
Constructor对象的newInstance():
支持调用任意构造器(包括私有、带参),异常更具体(比如NoSuchMethodException)。
//1.获取私有带参构造器(User有privateUser(Stringname))
ConstructorUserconstructor=User.class.getDeclaredConstructor(String.class);
//2.突破私有访问限制
constructor.setAccessible(true);
//3.创建实例
Useruser=constructor.newInstance(张三);
实际开发优先用这种,灵活性更高。
4.怎么用反射访问类的私有字段和私有方法?setAccessible(true)有什么作用?有风险吗?
答案:
核心是用getDeclaredXxx()(获取本类所有成员,包括私有),再通过setAccessible(true)突破封装。
访问私有字段示例:
classUser{
privateStringname;//私有字段
}
publicclassTest{
publicstaticvoidmain(String[]args)throwsException{
Useruser=newUser();
ClassUserclazz=User.class;
//1.获取私有字段(getDeclaredField()而非getField(),后者只能拿public)
FieldnameField=clazz.getDeclaredField(name);
//2.关闭访问检查:让私有字段可被外部操作
nameField.setAccessible(tru
您可能关注的文档
最近下载
- 国开2025年秋《农业推广》形成性考核1-3答案.docx
- 第七章_金属和半导体的接触.ppt
- 会计学课程设计报告会计学课程设计报告.doc VIP
- 6投资领域统计工作业务竞赛试题库.doc VIP
- 老年人运动能力下降多学科决策共识解读(2024版)PPT课件.pptx VIP
- GW-19CP.0011金风GWH 171-5.3 V11R01C100 机组产品说明书.pdf VIP
- 【MOOC】《中国马克思主义与当代》(北京科技大学)中国大学MOOC慕课答案.docx VIP
- 《数星星的孩子》课件.pptx VIP
- 【苏教版】六年级上册数学试题-计算能力训练六 .docx VIP
- ocean培训petrel re快速入门工作流程.pdf VIP
文档评论(0)