了解反射机制,我们就是要理解几个问题:
- 为什么需要反射
- 反射的概念
- 反射的应用
为什么需要反射
这里我们考虑一个情景,那就是,当你有两套以上代码适用于两种不同的生产环境,针对特定的某一种环境下,你需要选择对应的代码,那么这个时候我们是需要每次都修改main函数里的代码,重新编译发布吗?
这个问题的答案是显然的,这样不行。因为java作为一个静态语言,需要对代码先编译再解释执行,而不能动态修改源码,所以设计者就提出了反射的概念,用来解决代码动态设计的问题。
反射的概念
反射就是把Java类中的各个成分映射成一个个的Java对象。
即在运行状态中:
1、对于任意一个类,都能够知道这个类的所有属性和方法;
2、对于任意一个对象,都能够调用它的任意一个属性和方法。
这种动态获取信息以及动态调用对象方法的功能叫Java的反射机制。
原理
想要了解反射的基本原理,我们需要了解java程序的运行方式。
1、.java
文件通过javac
命令编译成.class
文件
2、.class
文件送入java虚拟机
解释运行
在解释运行的过程中,又包括.class
文件的类加载,加载到类元数据区,然后每次使用new实例化一个对象时,jvm就会返回一个引用,这个引用首先指向在类元数据区的类,而这个类不能直接被使用,会指向一个堆上的类元数据的副本。
这个时候,通过类名来获得其类元数据等信息,就像是光在镜子之间反射获取,故起名为反射机制。
主要功能
- 动态获取数据
我们上面的例子就是动态获取信息,通过配置文件+反射机制的方式,完成程序一次编译之后在多种生产环境下运行的情况。 - 动态调用对象
这个是指,在某些时候,对象的一些私有private方法和属性,没有办法显式获得,但是我们可以通过反射的机制,暴力获取。
反射的应用
Java基础技术中的代理、注解都是依托反射才能得以实现并应用广泛,另外我们常用的Spring、myBatis等技术框架也都是依托反射才能得以实现。