Java反射面试题及答案.docx

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 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

文档评论(0)

151****9429 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档