【Java面试】Java反射

Java反射机制允许程序在运行时动态获取类信息并调用对象方法。它提供了运行期类型判断和动态加载类的能力,提高了代码灵活性。然而,反射会降低性能,且可能导致封装性的破坏。反射的应用场景包括JDBC驱动加载、框架中的动态实例化和AOP代理的实现等。

什么是反射机制?

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

静态编译和动态编译
静态编译:在编译时确定类型,绑定对象
动态编译:运行时确定类型,绑定对象

反射机制优缺点
优点:

  • 运行期类型的判断,动态加载类,提高代码灵活度。
  • 提高代码复用率,比如动态代理就是用了反射实现
  • 可以在运行时获取任意一个类的方法,属性,并且还能通过反射动态调用

缺点:

  • 反射相当于一系列解释操作,通知 JVM 要做的事情,反射会涉及到动态类型的解析,所以JVM无法对这些代码做优化,所以性能会降低。
  • 使用反射后,代码可读性会下降
  • 反射亦可以绕过一些限制访问的属性和方法,可能破坏了代码本身的封装性和抽象性

说一说你对Java反射机制的理解

Java程序中的对象在运行时可以表现为两种类型,即编译时类型和运行时类型。例如 Person p = new Student(); ,这行代码将会生成一个p变量,该变量的编译时类型为Person,运行时类型为Student。

有时,程序在运行时接收到外部传入的一个对象,该对象的编译时类型是Object,但程序又需要调用该对象的运行时类型的方法。这就要求程序需要在运行时发现对象和类的真实信息,而解决这个问题有以下两种做法:

第一种做法是假设在编译时和运行时都完全知道类型的具体信息,在这种情况下,可以先使用instanceof运算符进行判断,再利用强制类型转换将其转换成其运行时类型的变量即可。

第二种做法是编译时根本无法预知该对象和类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息,这就必须使用反射。

具体来说,通过反射机制,我们可以实现如下的操作:

程序运行时,可以通过反射获得任意一个类的Class对象,并通过这个对象查看这个类的信息;

程序运行时,可以通过反射创建任意一个类的实例,并访问该实例的成员;

程序运行时,可以通过反射机制生成一个类的动态代理类或动态代理对象。

Java反射在实际项目中有哪些应用场景?

Java的反射机制在实际项目中应用广泛,常见的应用场景有:

使用JDBC时,如果要创建数据库的连接,则需要先通过反射机制加载数据库的驱动程序;

多数框架都支持注解/XML配置,从配置中解析出来的类是字符串,需要利用反射机制实例化;

面向切面编程(AOP)的实现方案,是在程序运行时创建目标对象的代理类,这必须由反射机制来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhangBlossom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值