反射

代码执行流程

在讲反射之前,我们先来看下我们写的代码究竟是如何被计算机执行的,这里给大家画了个图,如下所示

img

执行过程

  1. VS编译器会将编写好的代码进行编译,编译后会生成exe/dll文件,.Net Core里面已经不生成exe了,都是dll。dll和exe还需要CLR/JIT的即时编译成字节码,才能最终被计算机执行。
  2. 有伙伴就会问为什么要编译2次呢,先编译到dll,再编译到字节码01呢,为什么不能一次性编译成字节码呢?因为C#语言,但是真实运行的机器有很多种,可能是32位,也可能是64位,操作系统可能是windows、linux、unix等,不同的计算机不同的操作系统识别字节码的可能是不一样的,但是从高级语言编译成exe/dll这一步是一样的。所以只要在不同运行环境的计算机上安装对应的不同的CLR/JIT,就可以运行我们同一个exe/dll了。这里就大概讲下这样一个过程,后面会有章节详细讲解程序如何被计算机执行的。现在我们先关注编译生成的exe/dll,它包含2部分,分别是中间语言IL和源数据元数据metadata。
  3. IL里面包含我们写的大量的代码,比如说方法、实体类等
  4. 元数据metadata不是我们写的代码,它是编译器在编译的时候生成的描述,它可能是把命名空间、类名、属性名记录了一下,包括特性
    反射 就是读取metadata(基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包含的几个类,允许你反射(解析)这些元数据的代码里面的数据的,然后去使用它

反射的作用:

  1. 动态创建类型的实例,将类型绑定在现有对象,或从现有对象中获取类型
  2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型

反射注意点:

  1. 使用反射动态绑定需要牺牲性能
  2. 有些元数据信息是不能通过反射获取的

取得Assembly的方法:

Assembly.Load 
Assembly.LoadFile 
Assembly.LoadFrom 
Type对象的Assembly方法

创建实例的方法

System.Activator 的CreateInstance方法。该方法返回新对象的引用。具体使用方法参见msnd
System.Activator 的createInstanceFrom 与上一个方法类似,不过需要指定类型及其程序集
System.Appdomain 的方法:createInstance,CreateInstanceAndUnwrap,CreateInstranceFrom和CreateInstraceFromAndUnwrap
System.type的InvokeMember实例方法:这个方法返回一个与传入参数相符的构造函数,并构造该类型。
System.reflection.constructinfo 的Invoke实例方法
posted @ 2023-06-15 11:52  乐天--  阅读(13)  评论(0)    收藏  举报