一、前言
Reflection)的内容在博客中已经写了一篇,什么是反射,反射的使用,反射优缺点总结;在面试中突然被问道反射的原理,按照理解反射就是在Reflection命名空间和对象的Type对象获取类的方法、属性、特性等成员信息,但是又被问道为什么可以获取这些成员信息?就是反射机制依据的是什么,让其可以使用反射来获取程序集、程序集的类、创建对象、执行方法、获取属性和特性信息。
本篇文章就是要讲述清楚反射是怎么或者说如何获取程序信息?
二、内容
反射是如何通过如下的Reflection命名空间的类与方法获取获取类,方法名?
命名空间 | 描述 |
System.Reflection.Assembly | 程序集 |
System.Reflection.MemberInfo | 成员信息 |
System.Reflection.EventInfo | 事件 |
System.Reflection.FieldInfo | 字段 |
System.Reflection.MethodBase | 基类方法 |
System.Reflection.ConstructorInfo | 构造函数 |
System.Reflection.MethodInfo | 方法 |
System.Reflection.PropertyInfo | 属性 |
System.Type | 类、对象的类型对象 |
元数据(metadata),在程序高级语言中(C#)元数据的表现形式是一种二进制信息,用以对存储在公共语言运行库可移动执行文件(PE)或者存储在内存中程序进行描述,编译器將代码编译成PE文件时便会將元数据插入到该文件的一部分,而将代码转换为 Microsoft 中间语言 (MSIL) 并将其插入到该文件的另一部分中,所以包含元数据和使用中间语言將代码生成的部分。元数据將存储如下信息,程序集(名称、版本、区域性、公钥)、类的说明(名称、可见性、基类和实现的接口)、类的成员(方法、字段、属性、事件、嵌套的类型)等。当执行代码的时候,运行库將元数据加载到内存中,并通过引用它(元数据)来发现有关代码的类、成员、继承等信息。
反射则是审查元数据并收集关于它的类型信息的能力,元数据(编译后的最基本数据单元)一些表,当编译程序集货模块时,编译器会创建如下信息。1、关于程序集的元数据(清单)主要包含如下信息:标识信息(包括程序集的名称、版本、文化和公钥等);文件列表(程序集由哪些文件组成);引用程序集列表(该程序集所引用的其他程序集);一组许可请求(运行这个程序集需要的许可)。2、关于类型的元数据包含一个类定义表、一个字段定义表、一个方法定义表、方法参数表等,System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码 。
三、总结
通过面试被问到反射的原理,基于目前知识面只是知道反射是什么,怎么使用的,因为这件事情促使进一步深究了解到程序集,元数据的内容,了解到反射实现机制。从而对整个知识串联起来,形成一个体系,融会贯通。所以技术的学习过程是一个深入探究的过程,形成体系的过程,慢慢就会融会贯通了。