反射是什么

反射的定义:
反射式编程(英语:reflective programming)或反射(英语:reflection),是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。 用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。


为啥需要反射?

高级语言里面除了有函数,还有类、接口等概念,而反射技术就是一种控制和管理类的技术。高级语言编译出来的程序在运行时,就通过反射这个技术,能动态的获取到类实例的信息、创建实体类、操作实体类。

通俗地讲,反射类似于一个配置文件,两者都能让程序的行为更灵活,避免硬编码,但又有不同之处:

特性 配置文件 反射
抽象层级 数据层(描述“做什么”) 代码层(直接操作“如何做”)
动态性 静态(启动时加载) 动态(运行时决定)
修改成本 低(修改文件无需重新编译) 高(需修改代码逻辑)
安全性 安全(仅数据) 风险高(可能破坏封装性)
适用场景 参数化、环境配置 动态加载、框架开发、元编程

反射的功能列表:

  • 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等
  • 获取任意对象的属性,并且能改变对象的属性
  • 调用任意对象的方法
  • 判断任意一个对象所属的类
  • 实例化任意一个类的对象
  • 通过反射我们可以实现动态装配, 降低代码的耦合度, 动态代理等。
  • ...

Scene

一般应用开发者使用类的场景是:

  1. 需要自己创建一个类。
    先构想好一个类的结构,里面的属性和方法,然后使用代码编写好这些,通过new 关键字就能使用类了。

  2. 使用别人的创建好的类。
    查看别人已经写好的库是否满足需求,满足的话,就直接导入别人的库,还是通过new 关键字就能使用第三方库的类了。

所以大体来看一般的应用开发者很少或者不需要用到反射技术。那么谁需要用到反射技术?

  • 接口的开发者;
  • 框架的开发者;
  • 主程序员已经写好大部分类,但是不知道使用者要怎么调用,程序只能留下配置文件,使用者在使用这个程序之前,先配置好配置文件,然后程序运行的时候就自动加载配置文件内的类;

总结:反射技术可以让后人方便的调用前人写好的类。

问题1 请思考一下,使用反射和调用函数的区别?

  • 需要先看看反射和函数都是怎么样使用的。
  • 体会其中区别。

具体案例

  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)则换成另一个即可。

  2. Spring 框架的 IOC(动态加载管理 Bean),Spring通过配置文件配置各种各样的bean,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。
    还有Spring AOP(动态代理)功能都和反射有关系。

  3. 当然还有很多框架:mybatis、dubbo、rocketmq...等等都会用到反射机制。

posted on 2022-12-16 15:34  Mysticbinary  阅读(81)  评论(0)    收藏  举报