反射学习总结

原创 2013年12月02日 22:41:14

反射学习总结

         一个类中的成员包括字段、属性、方法和事件,这些成员都是这个类的元数据。反射就是在一个类的外部或它所在程序集外部,通过这个类的元数据,创建一个这个类的类型的对象,然后访问其中的成员。例如:有一个Person类,我们可以通过以下两种方法获得这个类的类型的对象:

         第一种方法,用typeof()方法获取:Type tp = typeof(Person);

         第二种方法,用对象获取:Person p = new Person();  Type tp = p.GetType();

         Type类是实现反射的一个很重要的类,它描述的是一个类的类型。我们可以通过Type类中的一些方法获得一个类的所有成员,包括private修饰的成员。这些成员可以用一个抽象类MemberInfo来表示,MemberInfo类的子类FieldInfo、PropertyInfo、MethodInfo、EventInfo分别用来存储类中的字段信息、属性信息、方法信息和事件信息。对于方法成员来说,我们可以调用MethodInfo类的对象的Invoke方法,来执行存储在这个对象中的方法。对于数据成员来说,每个存储该成员的信息的类中都有一个获取该数据的GetValue方法和设置该数据的SetValue方法。我们还可以通过Type类中的方法来判断类和类之间的关系以及类的特征,比如是否是静态和或抽象类等。

         反射用于很多地方,比如说VS的智能提示功能、反编译器等,但一般在支持插件的程序中都要用到。插件和主程序是两个不同的程序集,并且插件是否存在对于主程序的运行和使用都不会产生影响,但只要有插件连接到主程序中,主程序就会响应插件的功能。这就要求我们不能在代码中通过手动添加引用来把插件加载到主程序中,而只能动态添加对插件的使用。因为手动添加耦合性太高,并且对于主程序来说,这个插件是非要不可的,而且主程序的代码还要改动。使用反射之后,如果有插件,就会使用插件,如果没有,也不影响主程序,并且添加对插件的使用后,不会改动主程序的任何代码。因此,反射还能够很好的起到解耦的作用,即降低程序集之间的耦合性。

         要使用反射来动态加载插件,我们需要在主程序中有一个加载程序集的方法。程序集是.NET中的概念,一个dll文件或exe文件就是一个程序集,程序集可以看成是相关类打的一个包。它里面主要包含有类型元数据、程序集元数据、IL代码、资源文件,每个程序集都有自己的名称、版本等信息,这些信息可以通过AssemblyInfo.cs文件来自定义。加载一个程序集要用到Assembly类的LoadFile方法,这个方法需要一个插件的全路径作为参数。加载之后,就利用这个类的另一个方法GetTypes获得该程序集中定义的所有的类。这个方法返回一个Type类型的对象的集合,遍历这个集合,根据集合中对象的类型创建该类型的实例。创建实例时使用Activator类的CreateInstance方法,它返回一个object类型的对象。通过这些对象所在类中的方法,我们就可以使用插件的功能了。

         对比两种处理程序集的方式,传统手动添加引用的程序性能较高,但程序缺少灵活性和扩展性;使用反射动态添加引用会使程序灵活性大大提高,但是需要在使用插件时,才将IL代码转换为二进制代码,这会使程序性能降低。

相关文章推荐

反射机制和类加载机制学习总结

  • 2010年01月07日 08:36
  • 110KB
  • 下载

黑马程序员--java学习之反射总结

---------------------- android培训、java培训、期待与您交流! ---------------------- 一.反射的概念 反射就是把Java类中的各种成分映射成...

Java反射学习总结一(基础篇)

1.使用反射的第一步, 找到class对象(1.Class.forName(); 2.object.class.newInstance(); 3.object.getClass()) //获取某个类...

黑马程序员_学习笔记7可变参数的应用及1.5增强for的联合使用以及反射的总结

---------------------- android培训、java培训、期待与您交流! ----------------------   可变参数的特点: 1,只能出现在参数列表最后; ...

反射学习总结

Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助。  那么什么是Java的反射呢?  大家都知道,要让J...

【反射学习总结(下)】

通过对反射(上)总结: 我们知道:反射就是:把各个java类中的成分全部映射到相应的java类中来。 下面我们来总结一下反射出来的一些基本的JAVA类: 主要有以下几个方面的内容: 《一、Me...

Java反射学习总结四(动态代理使用实例和内部原理解析)

动态代理就是应用两个类来实现的

C#反射学习总结

详解C#中的反射 反射(Reflection) 两个现实中的例子: 1、B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况。这是如何做到 的呢?B超是B型超声波,...

JAVA 反射学习总结

名词概念的理解 现实中的反射 反射是一种相对的状态或者行为; 就是对自身的把控,跟操控对方一样,我来控制自己; 大赛临近的时候,刘翔不是经常说么“没有对手,最大的对手就是自己”,这就是...

Java反射学习总结(三)

Class对象表示所加载的类,取得Class对象后,我们就可以愉快的取得与类相关的信息了,就像包(package,package也是类名的一部分哦~),构造方法,方法,属性等信息,而每一个信息,也会有...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反射学习总结
举报原因:
原因补充:

(最多只允许输入30个字)