关于反射的初步介绍

声明:本文最初是本人写在51CTO的一篇学习笔记,原文地址:http://kestrelsaga.blog.51cto.com/3015222/612118

反射的作用:

1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型;

2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射;

3. 反射主要应用于类库,这些类库需要知道一个类型的定义,以便提供更多的功能。 应用要点: 1. 现实应用程序中很少有应用程序需要使用反射类型 2. 使用反射动态绑定需要牺牲性能 3. 有些元数据信息是不能通过反射获取的 4. 某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的

反射机制调用的步骤

反射相关的命名空间System.reflection,常用的类有Assembly、MemberInfo、EventInfo、MethodInfo 、ConstructorInfo 、PropertyInfo、System.Type

1 加载程序集

2 获取类的类型

3 创建该类的实例

4 调用该实例的方法

详细见下面解说:

1、加载程序集

System.Reflection.Assembly类有两个静态方法:

Assembly.Load(string assemblyname)

Assembly.LoadFrom(string filename)

备注:

这两个方法把程序集加载到应用程序域中。

通常应用程序集名称是一个不包含扩展名的文件名。例如,TestApp.exe和BusinessObjectLibrary.dll的程序集名称分别是TestApp和BusinessObject。

如果希望CLR根据指定的程序集名称找到程序集,应该使用Assembly.Load()方法。但是如果该程序集被强命名(strongly named),你必须同时提供程序集名称和公钥(public key token),以向CLR说明你的意图是:首先试图从GAC(Global Assembly Cache,全局程序集缓存)加载程序集,如果失败,继续在应用所在目录和私有路径目录中寻找并且加载程序集.

另一种加载程序集的途径是通过Assembly.LoadFrom(string filename)。如果你希望加载的程序集超出了CLR的预定探查范围,你可以用这种办法直接从一个文件位置加载程序集。

  2、获取类的类型

Type objType = assm.GetType (“TestApp.BusinessObject”);,

■ System.Type与反射相关的常用方法.

GetMethod 获取当前 Type 的特定方法。

GetMethods 获取当前 Type 的方法。

GetProperties 获取当前 Type 的属性 (Property)。

GetProperty 获取当前 Type 的特定属性 (Property)。

GetInterface 获取由当前 Type 实现或继承的特定接口。

GetInterfaceMap返回指定接口类型的接口映射。

GetInterfaces当在派生类中重写时,获取由当前 Type 实现或继承的所有接口。

GetEvent 获取由当前 Type 声明或继承的特定事件。

GetEvents 获取由当前 Type 声明或继承的事件。

InvokeMember 调用当前 Type 的特定成员。

备注:

它返回程序集(本例即assm)中的类类型信息。GetType()方法会重载(overload) 多次。在这个例子中,希望用指定类型名创建一个Type对象,该指定类型名采用命名空间加上类名的形式(如果此类在GAC中,你还必须提供公钥,而版本号为可选参数,可根据情况决定是否提供)。从代表BusinessObject类的Type实例objType中,你能得到很多有用的信息,例如objType.GetMethods()返回BusinessObject类中所有方法的信息,而objType.GetProperties()返回所有属性的信息。

3、创建类的实例

object objInstance = System.Activator.CreateInstance(objType);

4、调用该实例的方法

MethodInfo miEx = objType.GetMethod("DoWork");

miEx.Invoke(objInstance, null);

备注:

最后一步是调用DoWork()方法。miEx.Invoke和bo.DoWork()(BusinessObject bo =new BusinessObject(); bo.DoWork();)完成同样的工作。 MethodInfo.Invoke()方法支持object[]类型的参数,它代表目标方法的输入参数数组。

时间: 2024-10-17 06:27:54

关于反射的初步介绍的相关文章

Swift初步介绍

Swift是本届WWDC大会苹果推出的一门新开发语言,开发者网站上已经放出了这门新语言的介绍.教程和手册,如果手里有一台iOS设备的话,通过苹果的iBooks应用,从它的官方书店里搜索Swift,可以下载它的官方手册电子书版. 为什么苹果要推出一门新的语言?现在苹果平台的主力开发语言,Objective-C已经无法再进化,无法再发展了,已经无法再赶上现代编程语言前进的步伐!了解Objective-C历史及原理的人都知道,Objective-C是门抄捷径的语言,它基本上没有发明新语法,仅仅是将Sm

三、Android学习第三天——Activity的布局初步介绍(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 三.Android学习第三天——Activity的布局初步介绍 今天总结下Activity相关布局的一些知识: Activity最简单跟常用的布局分为两种: ①LinearLayout -- 线性布局 ②TableLayout -- 表格布局 ③RelativeLayout -- 相对布局(今后将会频繁的使用到这个布局) 下面来简单总结下前两种(线性/表格)布局当中常用到

java反射机制简单介绍

1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2.java反射的基础是Class类(注意不是小写的class),Class类实例代表着内存中的一份字节码.常见的获取Class类对象的方法例如以下(第一种为对象的方法,另外一种为类的方法): Dog dog = new Dog(); Class dogClass = dog.getClass();

【搜索引擎Jediael开发笔记1】搜索引擎初步介绍及网络爬虫

详细可参考 (1)书箱:<这就是搜索引擎><自己动手写网络爬虫><解密搜索引擎打桩实践> (2)[搜索引擎基础知识1]搜索引擎的技术架构 (3)[搜索引擎基础知识2]网络爬虫的介绍 (一)搜索引擎的开发一般可分为以下三大部分 1.数据采集层:一般使用爬虫获取互联网的数据,重要的开源项目有Heritrxi 2.数据分析处理层:将从互联网上获取到的数据进行提取归类.分词.语义分析得出索引得内容,等待用户查询使用,重要的开源项目有Lucene 3.视图层:也用户的交互界面,如

Html/CSS 初步介绍html和css部分重要标签

&初步介绍html和css部分重要标签& 注:开头书写:<!DOCTYPE html>表明对应标准html代码 html标签(仅有一个),内部可以写属性 自闭合标签      例:<meta /> 主动闭合标签          大多都需主动闭合 head标签: -<meta > 编码,跳转/刷新(提及但不推荐在此书写),关键字,描述,IE兼容(主要避免IE6的乱码问题,现今无需考虑) -title 标签 -Link    搞图标 -style     

面向对象基础-初步介绍

面向对象中的基础介绍: 一:在面向对象的方法中:一切事物皆对象,只要是对象就会分类别:只要是对象就会有属性. 二:面向对象的三个属性:封装.继承.多态: 封装含义:把一些功能的实现细节不对外暴露: 继承含义:一段代码,重复使用(代码重用): 多态含义:一种接口,多种实现(接口重用): 三:新式类与经典类的区别:多继承上的顺序问题, 查询策略: 广度优先:先查找横向策略再去查纵向(新式类的查询策略): 深度优先:顺序查询(经典类的查询策略): py2的经典类是按照深度优先来继承的,新式类是按广度优

Python中的对象类型的初步介绍

一:介绍 1.为什么使用内置对象 对象类型是语言的一个部分 内置对象构成了每个python程序的核心部分 2.核心数据类型 数字 字符串 列表 字典 元组 文件 集合 其他类型 编程单元类型 与实现相关的类型 二:数字 1.**是乘方 2.math数学模块 3.random模块 三:字符串 1.介绍 字符串是单个

2017年8月27日 反射的初步认识

反射原理主要是为了做框架用的,但是了解底层原理对以后深入理解框架概念还是蛮有帮助的. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着

OC基础--常用类的初步介绍与简单实用之集合类

集合类的异同点 一.NSArray\NSMutableArray *有序 *快速创建(只有不可变数组可以):@[obj1, obj2, obj3]; *快速访问元素:数组名[i] *只能存放对象 二.NSSet\NSMutableSet *无序 *只能存放对象 三.NSDictionary\NSMutableDictionary *无序 *快速创建(只有不可变数组可以):@{key1 : value1, key2 : value2,...} *快速访问元素:字典名[key] *只能存放对象 四.