反射
对于一个现有对象,能够在不使用new操作符、不知道其具体静态类型的情况下,创建出一个同类型的对象,还能访问这个复制品对象拥有的各个成员。
相当于进一步的解耦,可以不使用new操作符,就没有类型的依赖关系
这样的耦合关系甚至可以弱到忽略不计
反射在.NET和JAVA中非常重要
为什么需要反射
很多时候,程序的逻辑不是在写程序的时候就能确定的
有时候是要到用户与程序进行交互的时候,才能确定,此时程序已经处在运行状态(动态状态)
如果要在静态状态(写程序时)预测和枚举出用户可能做出的所有操作,程序可能变的非常臃肿
反射的性能影响
反射是动态地拿到对对象的描述、类型的描述,再用这些描述创建新的对象,对程序的性能会有负面影响
示例1:未封装的反射
代码详见C#inVS2/反射与依赖注入/Core反射1-坦克
使用反射需要引用命名空间
实际运用中使用的大多都是封装好的反射
依赖注入
依赖注入与依赖反转的关系
依赖反转是一个概念
而依赖注入,是在依赖反转概念的基础上,结合接口与反射机制
形成的一种应用
依赖注入具体操作与意义
这是一种在程序开头,通过注册给接口绑定一个变量类型
创建实例时通过这个接口创建,不直接通过new+类型 创建
就可以将所有实例创建的紧耦合 转化为 注册时接口与变量类型绑定的一行松耦合
使用了微软提供的容器
依赖注入操作在JAVA的许多框架中也有,但可能换个称呼
有的称作“自动连线”,(将接口与变量类型相连)
反射应用
“以不变应万变”
应用场景
反射常应用在 【插件式编程】中
插件
插件是不与主体程序一起编译,但是和主体程序一起工作的组件
可以以主体程序为中心,生成一个生态圈
主体与插件的关系就是 “以不变应万变” 的关系,写主体程序时不可能枚举出可能安装的所有插件
SDK:程序开发包,API:程序开发接口