首页 > 其他分享 >反射

反射

时间:2023-06-15 12:00:43浏览次数:30  
标签:反射 exe System dll 编译 方法

代码执行流程

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

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实例方法

标签:反射,exe,System,dll,编译,方法
From: https://www.cnblogs.com/blackamon/p/17482501.html

相关文章

  • c# 使用反射调用泛型方法
    简单记录一次反射的使用。目前有一个DbService的ListQuery(stringexpression=“”)方法,需要根据下拉框选择不同的数据实体类,更新Wpf的Datagrid数据,简单如下图。......
  • 注解和反射
    注解和反射注解什么是注解?Annotation是从JDK5.0开始引入的新技术。Annotation的作用:不是程序本身,可以对程序作出解释(这一点和注释(comment)没什么区别)。可以被其他程序(比如:编译器等)读取。Annotation的格式:注解是以“@注释名”在代码中存在的,还可以添加一些参数......
  • Java反射(Class类)常用方法(附Xmind整理)
    文章目录一、类加载器1、Java类加载机制2、ClassLoader类加载器二、获取Class对象的方式1、Class.forName("全类名")2、类名.class3、对象.getClass()三、常用方法:1、获取构造方法、成员方法、成员变量(公开的public)2、获取构造方法、成员方法、成员变量(所有的public+private)3......
  • C# 使用Expression代替反射获取动态类中的值
    示例代码:classPerson{publicintId{get;set;}publicstringName{get;set;}}privateobjectobj=newPerson{Id=123,Name="fred"};项目中的Class都是动态生成的,只好用object来存储。一般常规的方法是用反射去获取对应属性的值,由于......
  • [转]C#---特性与反射
    C#---特性与反射 所有.NET支持的语言编写出来的程序,在对应的编译器编译之后,会先产出程序集,其主要内容是中间语言IL和元数据。之后,JIT再将IL翻译为机器码(不同机器实现方式不同)。IL使得跨平台成为可能,并且统一了各个框架语言编译之后的形式,使得框架实现的代价......
  • 反射
    Typetype=typeof(对象);//获取类型varuserActivityModel=(对象)Activator.CreateInstance(type);//创建对象foreach(variteminmodel.ChildControl){intindex=0;foreach(varPropi......
  • 物体反射光场BRDF模型
    一、基本概述    双向反射分布函数(BidirectionalReflectanceDistributionFunction,BRDF)是用来定义给定入射方向上的辐射照度如何影响给定出射方向上的辐射率。更笼统地说,它描述了入射光线经过某个表面反射后如何在各个出射方向上分布这可以是从理想镜面反射到漫反射、......
  • 注解与反射的学习
    java中的注解和反射学习1.注解1.Annotation是JDK5.0引入的新技术2.作用不是程序本身,可以对程序作出一些解释(这一点和注释(comment)没什么区别)可以被其他程序(如编译器)读取3.Annotation的格式:以“@注释名”在代码中存在,还可以添加一些参数值,例如@SuppressWarnings(value="un......
  • 反射:获取类的成员方法
              ......
  • 反射:获取类的成员变量
        ......