反射机制就是java开了后门,允许程序员在程序运行期间,获取到class对象元数据信息,从而对类结构、属性、方法进行动态分析和操作
原理:native方法
class.forName,以及invoke,getMethod等方法都是native方法。反射的实现原理就是通过native方法来直接访问方法区操作
获取到class对象,就获取到了类的元数据信息
获取class对象的方法:
- 直接class.forName,通过全类名获取
- 通过对象获取, xxx.getClass()
- 通过类的class属性 例如 String.class
意义:
远程调用Rpc,调用方发过来一段json文本,通过反射机制,可以动态创建出来对象,动态调用其方法
Rpc的原理就是调用方使用动态代理,接收方使用反射
SpringBoot 的依赖注入也使用了反射,根据名称实例化对象。并且使用反射将属性set回去。没有set方法也可以通过反射进行注入
SPI机制
- 调用方只面向接口编程
- 通过ServiceLoader扫描一个文本文件,将其中的类全路径,使用反射进行实例化,提供服务
- 可以灵活切换实现类
自动装配
根据property配置文件,使用SPI反射机制,自动创建对象放入IOC容器。@Service @Compoment等属于是CompomentScan扫描创建出来的,不算是自动装配。只有通过springBoot的property文件创建出来的才算是自动装配,例如datasource
依赖注入
一个类直接使用Resource、Autowired直接就能注入属性,也没有set方法。底层就是使用了反射,直接塞值
IOC
- IOC控制反转就是将创建对象不在代码写死控制,让别人来控制创建哪个对象,依赖注入就是只声明依赖,容器负责创建对象
- IOC实现原理就是反射
- 入参是类全路径name,根据字符串创建对应的对象