VC#.NET入门精典------(专题技术理解)反射篇

原创 2004年08月17日 19:48:00

一直想用自己的语言通俗的讲述什么是.net中的反射.但看过下面的讲述后我想已经没有自己写的必要了.拿出来共享,原文出处不明,可能是来自MSDN.

什么是反射?
    Reflection,中文翻译为反射。
    这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息,例如:

    Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。
    Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
    MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。
诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。

命名空间与装配件的关系?
    很多人对这个概念可能还是很不清晰,对于合格的.Net程序员,有必要对这点进行澄清。
    命名空间类似与Java的包,但又不完全等同,因为Java的包必须按照目录结构来放置,命名空间则不需要。

    装配件是.Net应用程序执行的最小单位,编译出来的.dll、.exe都是装配件。

    装配件和命名空间的关系不是一一对应,也不互相包含,一个装配件里面可以有多个命名空间,一个命名空间也可以在多个装配件中存在,这样说可能有点模糊,举个例子:
装配件A:
namespace N1
{
   public class AC1 {…}
   public class AC2 {…}
}
namespace N2
{
   public class AC3 {…}
   public class AC4{…}
}
装配件B:
namespace N1
{
   public class BC1 {…}
   public class BC2 {…}
}
namespace N2
{
   public class BC3 {…}
   public class BC4{…}
}

    这两个装配件中都有N1和N2两个命名空间,而且各声明了两个类,这样是完全可以的,然后我们在一个应用程序中引用装配件A,那么在这个应用程序中,我们能看到N1下面的类为AC1和AC2,N2下面的类为AC3和AC4。
    接着我们去掉对A的引用,加上对B的引用,那么我们在这个应用程序下能看到的N1下面的类变成了BC1和BC2,N2下面也一样。
    如果我们同时引用这两个装配件,那么N1下面我们就能看到四个类:AC1、AC2、BC1和BC2。

    到这里,我们可以清楚一个概念了,命名空间只是说明一个类型是那个族的,比如有人是汉族、有人是回族;而装配件表明一个类型住在哪里,比如有人住在北京、有人住在上海;那么北京有汉族人,也有回族人,上海有汉族人,也有回族人,这是不矛盾的。

    上面我们说了,装配件是一个类型居住的地方,那么在一个程序中要使用一个类,就必须告诉编译器这个类住在哪儿,编译器才能找到它,也就是说必须引用该装配件。
    那么如果在编写程序的时候,也许不确定这个类在哪里,仅仅只是知道它的名称,就不能使用了吗?答案是可以,这就是反射了,就是在程序运行的时候提供该类型的地址,而去找到它。

【收藏】经典shell十三问

shell 十三问: 1) 为何叫做 shell ?  2) shell prompt(PS1) 与 Carriage Return(CR) 的关系?  3) 别人 echo、你也 ...
  • apache0554
  • apache0554
  • 2015年02月11日 15:41
  • 13858

且谈谈我对Java反射的理解

Java培训、Android培训、iOS培训、.Net培训、期待与您交流!  在张老师的课程当中,谈到了反射的概念,用冯伟立学长的最简单的一句话来说就是:反射就是把Java类中的各种成分映射成相应的J...
  • piaoyi493279486
  • piaoyi493279486
  • 2015年05月10日 20:00
  • 1964

SHELL编程之常用技巧

前言本文是shell编程系列的第六篇,集中介绍了bash编程中部分高级编程方法和技巧。通过学习本文内容,可以帮你解决以下问题: bash可以网络编程么? .(){ .|.& };. 据说执行这些符号可...
  • renwotao2009
  • renwotao2009
  • 2016年06月21日 07:58
  • 1016

深入理解java---反射篇

深入理解java---反射篇  背景    在Java中如果我们预先不知道一个对象的确切类型,RTTI可以告诉你,但是有一个限制,那就是在编译的时候这个对象类型必须是确定的(需要有一个确定的编译类型...
  • yinbingqiu
  • yinbingqiu
  • 2016年10月29日 10:37
  • 496

对java反射机制的一些理解

1.什么是java的反射机制? 说实话,一开始的时候我真的不知道什么是java的反射机制,反射机制又有什么用呢?甚至于在刚开始的时候,我还觉得java反射机制真的麻烦,还不如平常的使用类以及其实例对...
  • YQYnsmile
  • YQYnsmile
  • 2016年08月14日 10:47
  • 2001

泛型与反射的使用总结之反射篇

前一篇对泛型进行了一番总结,本篇就来说说与泛型有关的反射。     我在泛型篇中说到了泛型在JVM中是会被擦除的,不过擦除的类还是“残留”了一些泛型的痕迹。比如Person类,虽然擦除掉了泛型,但是...
  • yz7074998
  • yz7074998
  • 2015年03月05日 17:03
  • 668

React-Native从入门到放弃(一)准备篇

facebook官方教程(英文) react-native源码 中文视频(目前中文只更新到0.28) 前言 虽然大维哥从事编程的时间不是很长,但是一直认为未来计算机语言的发展必将是跨平台,...
  • ruglcc
  • ruglcc
  • 2016年12月20日 05:25
  • 806

Java多态性理解,好处及精典实例

核心: 1、多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到...
  • Jian_Yun_Rui
  • Jian_Yun_Rui
  • 2016年10月26日 20:12
  • 9434

精典的正则表达式

想起几天没有写博文了 今天给大家贡献一份正则表达式 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 只能输入数字:"^[0-9]*$"。 只能输入n位的数字:"^\d{n}$"。...
  • dsn727455218
  • dsn727455218
  • 2017年03月28日 14:25
  • 193

JAVA精典算法

JAVA经典算法40题 【程序1】  题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?   1....
  • wtfpewfn
  • wtfpewfn
  • 2013年01月21日 09:11
  • 413
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC#.NET入门精典------(专题技术理解)反射篇
举报原因:
原因补充:

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