反射是什么
反射的定义:
反射式编程(英语:reflective programming)或反射(英语:reflection),是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。 用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。
为啥需要反射?
高级语言里面除了有函数,还有类、接口等概念,而反射技术就是一种控制和管理类的技术。高级语言编译出来的程序在运行时,就通过反射这个技术,能动态的获取到类实例的信息、创建实体类、操作实体类。
通俗地讲,反射类似于一个配置文件,两者都能让程序的行为更灵活,避免硬编码,但又有不同之处:
| 特性 | 配置文件 | 反射 |
|---|---|---|
| 抽象层级 | 数据层(描述“做什么”) | 代码层(直接操作“如何做”) |
| 动态性 | 静态(启动时加载) | 动态(运行时决定) |
| 修改成本 | 低(修改文件无需重新编译) | 高(需修改代码逻辑) |
| 安全性 | 安全(仅数据) | 风险高(可能破坏封装性) |
| 适用场景 | 参数化、环境配置 | 动态加载、框架开发、元编程 |
反射的功能列表:
- 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等
- 获取任意对象的属性,并且能改变对象的属性
- 调用任意对象的方法
- 判断任意一个对象所属的类
- 实例化任意一个类的对象
- 通过反射我们可以实现动态装配, 降低代码的耦合度, 动态代理等。
- ...
Scene
一般应用开发者使用类的场景是:
-
需要自己创建一个类。
先构想好一个类的结构,里面的属性和方法,然后使用代码编写好这些,通过new 关键字就能使用类了。 -
使用别人的创建好的类。
查看别人已经写好的库是否满足需求,满足的话,就直接导入别人的库,还是通过new 关键字就能使用第三方库的类了。
所以大体来看一般的应用开发者很少或者不需要用到反射技术。那么谁需要用到反射技术?
- 接口的开发者;
- 框架的开发者;
- 主程序员已经写好大部分类,但是不知道使用者要怎么调用,程序只能留下配置文件,使用者在使用这个程序之前,先配置好配置文件,然后程序运行的时候就自动加载配置文件内的类;
总结:反射技术可以让后人方便的调用前人写好的类。
问题1 请思考一下,使用反射和调用函数的区别?
- 需要先看看反射和函数都是怎么样使用的。
- 体会其中区别。
具体案例
-
很多Web项目底层数据库有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了。
假设 com.mikechen.java.myqlConnection、com.mikechen.java.oracleConnection 这两个类我们只用其中一个,那我们在使用 JDBC 连接数据库时使用 Class.forName()通过反射加载数据库的驱动程序,如果是mysql则传入mysql的驱动类(com.mikechen.java.myqlConnection),而如果是oracle(com.mikechen.java.oracleConnection)则换成另一个即可。 -
Spring 框架的 IOC(动态加载管理 Bean),Spring通过配置文件配置各种各样的bean,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。
还有Spring AOP(动态代理)功能都和反射有关系。 -
当然还有很多框架:mybatis、dubbo、rocketmq...等等都会用到反射机制。
浙公网安备 33010602011771号