反射是一种自我观察的能力,在程序运行时,对任意一个类,我们可通过class、constructor、field、method四个方法获取该类的各个组成部分,在java程序运行时,对任意类,我们都可通过该类了解到其包含哪些属性和方法,这种动态获取当前类对象的信息以及动态调用对象方法的功能来自于反射机制。
对于java而言,可利用反射机制获得类似于动态语言的特点,虽然我们都知道java并不是动态语言,但是java具有一定的动态性,可被称之为“准动态语言”,那么反射就是java被视为动态语言的关键,允许程序在执行期间借助reflection API取得任何类的内部消息并能直接操作任意对象的内部属性及方法,具体过程为Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建,加载完之后在堆内存中,就产生了一个Class类型的对象,一个类只有一个Class对象,这个对象就包含了完整的类的结构信息,我们可以通过这个对象看到类的结构,而这个对象就像一面镜子,透过这个镜子可以看到类的结构,所以我们形象的称之为反射.
反射机制本质上为java先得到class对象后,通过对class对象进行反编译,从而获取对象的各种信息,该过程是从class文件到java文件,是反编译的过程,但我们都知道java是先编译再执行的语言,计算机也不能直接运行java文件,需要先经过JVM编译成class文件后才能运行,该过程是从java文件到class文件,是编译的过程。
反射最大的用途体现在框架,比如:Spring中的Di/IOC、JDBC中的classForName()、SpringBoot的Service注解等,很多开发框架都用到了反射机制,但如果大量使用反射会导致系统性能大打折扣。