反射
2023-09-11 14:14:10 时间
最初认识的反射,脑海里仅仅有命名空间和程序集的概念,觉得仅仅要知道类所在的命名空间和程序集的名称,就能实例化所须要的类。
一直没有好好理解反射的真正意义在哪里,动态更换程序集(dll)。
不将dll加入引用到引用列表中。就能够做到动态更换程序集。
反射载入程序集的几种方法
- 不引用对应的dll。通过绝对路径载入
//通过绝对路径载入程序集方法一
Assemblyassembly=Assembly.LoadFile("E:\\高效平台\\基础3.0\\ITOO3.1技术分享\\反射\\ITOO_Reflection\\ITOO_Reflection\\ITOO_DAL\\bin\\Debug\\ITOO_DAL.dll");
//通过绝对路径载入程序集方法二
Assembly assembly =Assembly.LoadFrom("E:\\高效平台\\基础3.0\\ITOO3.1技术分享\\反射\\ITOO_Reflection\\ITOO_Reflection\\ITOO_DAL\\bin\\Debug\\ITOO_DAL.dll");
//通过绝对路径载入程序集方法三
Assembly assembly =Assembly.ReflectionOnlyLoadFrom("E:\\高效平台\\基础3.0\\ITOO3.1技术分享\\反射\\ITOO_Reflection\\ITOO_Reflection\\ITOO_DAL\\bin\\Debug\\ITOO_DAL.dll");
- 引用对应的dll,通过默认的路径载入(此种方法运用反射就没有意义了,由于已经做不到动态更换dll了)
Assemblyassembly = Assembly.Load("ITOO_DAL");
- 改变dll的生成路径,通过默认的路径载入
//通过改变ITOO_DAL文件dll的路径载入默认bin\debug\下的dll
Assembly assembly =Assembly.Load("ITOO_DAL");
常规的引用方式,能够在程序中通过命名空间获取类,方法,属性
分析:
- 通过引用dll到对应的引用列表中。我们是无法做到在程序公布后,动态更换dll的(我们常规的通过 Using(Import) 命名空间 的缺陷)
- 可是与传统方式引用dll,在代码中Using(Import)命名空间相比,反射得到的类,实例化和调用都非常困难。
- 解决方式。利用上一层的接口进行强转,可是这样仅仅能调用类中的公有方法,私有方法和静态方法,属性还是无法直接调用(接口是一组方法的集合)
- 解决方式二:利用抽象类进行强转,既能够调到当中的公有属性也能够调到当中的公有方法,父类中的静态方法也能够成功被调用。可是子类中的静态方法还是不能被调用
综上(个人见解):反射应用的最适合的一种场景是:针对接口或抽象类编程,而且,接口和实现不在同一个项目中,此时负责详细实现的程序集dll,能够做到随时随地替换。比如机房中成功地切换了数据库。
反射也有一定的弊端:类的部分属性或方法调用困难。
相关文章
- Java反射机制详解(2) -例子
- DVWA之Reflected XSS(反射型XSS)
- c++反射技术
- 通过反射,获取类的属性
- PHP 反射
- 扩展方法的几个实例,扩展基本类型、接口、通过反射让扩展方法使用私有成员等
- Java反射机制
- 反射、内省与类型系统
- 动态语言-解释器-反射与内省
- 反射
- java反射获取class
- Q_OBJECT提供了信号槽机制、国际化机、RTTI 的反射能力(cpp中使用Q_OBJECT导致无法处理moc,就需要#include “moc_xxx.h”)
- C++反射机制:可变参数模板实现C++反射(使用C++11的新特性--可变模版参数,只根据类的名字(字符串)创建类的实例。在Nebula高性能网络框架中大量应用)
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 【Unity3D日常开发】Unity3D中 C#反射Reflection的使用