今天关于反射的争论不少了,不过,个人觉得为了避免误导新手,有必要谈一下反射的本质。在我看来,反射的本质在于元数据,它是一种获取和使用元数据的技术。“反射”从字面上理解,可以认为是洞察和使用内部信息的手段。Microsoft等N公司对命名是非常有研究的。

元数据是一种关于数据的数据,有点绕口,说白点就是一种数据的描述信息。在C#,其元数据存在Module中,用于描述这个Module所有类型的信息,这种信息包括类型描述、类型Attribute、成员、事件信息等,总之,关于一个Class,所有的描述信息都在这个Module的元数据中定义。

我们可以通过Reflection这个命名空间来获取这些元数据,对应一个程序集的描述是Assembly类,对应一个Class的元数据就是Type,当然还有ConstructorInfo、PropertyInfo、FieldInfo、EventInfo、MethodInfo、ParameterInfo、Attribute等。利用这个反射命名空间,我们可以获取一个Assembly中所有类型的描述,利用这些元数据可以动态的创建类的实例,获取/设置属性,获取事件并订阅事件,调用方法,获取一个类/属性/字段/方法/构造器/参数的Attribute。我们在编程时能做到的事情,利用反射也基本能够做到。

因此,反射是一种在运行时获取和使用元数据的技术。其本质在于元数据,这是原理性的,其它的都是从这衍生出来的。如果认为掌握了动态调用就认为掌握了反射,那可能需要浪费时间和经历,最后才知道反射与元数据相关,没有元数据就没有反射。这是浅尝辄止而导致无知的代价。

反射的使用场景大部分都是动态设置类型字段/属性,或动态调用方法。我个人认为,Attribute也是反射一个非常诱人的技术,它可以使用户通过声明一个Attribute而附加一些有用的功能,声明Attribute实现一种功能类似于面向上下文编程,可以极大简化代码数量。我在一个Agent编程平台为了简化用户应用,就采用了大量的元数据。

 1 /// <summary>
 2 /// 定义一个感知天气变化的智能体。
 3 /// </summary>
 4 [Agent]
 5 [Sensible(typeof(Environment), "Temperature")]
 6 public interface IMyAgent
 7 {
 8   /// <summary>
 9   /// 穿衣服。
10   /// </summary>
11   [Intelligent]
12   void Wear();
13 
14   /// <summary>
15   /// 脱衣服。
16   /// </summary>
17   [Intelligent]
18   void Disrobe();
19 
20   [Intelligent]
21   void OpenTheDoor();
22 }

我在2005年实现的O-O映射组件也使用了很多的Attribute。

反射技术由于其本身的动态性,具备了强大的功能,但是这些功能都是双刃剑,确实有性能牺牲,因此,应该平衡使用,不是滥用或者不用。要想真正学习反射,最好找本基础编程手册,系统的学习一下。本文也仅是说了一点皮毛而已。

反射的本质——元数据相关推荐

  1. 利用反射及JDBC元数据编写通用的查询方法 cp66的头像 cp66 7 2015-02-13 23:16 0

    遇到了若干问题: 1.从oracle返回的列名都是大写,再用反射,就找不到相对应得 名字 2.oracle 中number类型 返回来,就变成了BigDecimal public static voi ...

  2. c# 反射技术杂谈。,

    概念 反射 能够查看元数据的类型,等信息的一种能力. 元数据 编译以后最基本的数据单元.本质上就上一大追表.当程序编译之后就能形成很多表,比如类定义表,字段定义表,方法定义表. 反射技术 就是使用RE ...

  3. Java反射最全面总结(附代码)

    Java反射最全面总结 Java中的编译类型 ①.静态编译:在编译时确定类型,绑定对象即通过 ②.动态编译:在运行时确定对象类型,绑定对象体现了Java的灵活性和多态性,降低类之间的耦合度. 反射的原 ...

  4. javabean反射改字段内容_BAT程序员编写:深入理解 Java 反射和动态代理源码分析...

    什么是反射 反射(Reflection)是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. 通过反射机制,可以在运行时访问 Java ...

  5. Java资深反射玩家

    1.反射概述 2.获取Class类对象的三种方法 3.Class类的常用方法 4.反射获取构造方法并使用 5.反射获取类的成员属性并使用 6.反射获取类的成员方法并使用 7.反射的优缺点 8.反射的注 ...

  6. [你必须知道的.NET]第二十五回:认识元数据和IL(中)

    说在,开篇之前 书接上回[第二十四回:认识元数据和IL(上)],我们对PE文件.程序集.托管模块,这些概念与元数据.IL的关系进行了必要的铺垫,同时顺便熟悉了以ILDASM工具进行反编译的基本方法认知 ...

  7. 初学者python笔记(封装、反射、类内置attr属性、包装与授权)

    文章目录 封装 反射 动态导入模块 类内置attr属性 包装与授权 本篇文章仍然是面向对象的相关内容,主要分析了封装.反射.动态导入模块.类内置attr属性.包装与授权三大面向对象编程的后续处理方法 ...

  8. 测试开发必须掌握的知识点:Java反射

    Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时通过Reflection APIs取得任何一个已知名称的class的内部信息以及任意一个对象的内部信息. Spr ...

  9. C#基础知识梳理系列十五:反射

    摘 要 反射,一个很有用且有意思的特性.当动态创建某个类型的实例或是调用方法或是访问对象成员时通常会用到它,它是基于程序集及元数据而工作的,所以这一章我们来讨论一下程序集.反射如何工作.如何动态创建类 ...

最新文章

  1. 指定的文件夹没有包含设备的兼容软件驱动程序_Windows 10 2020年5月更新兼容性问题汇总...
  2. 全新思科数字化解决方案与产品让企业如虎添翼
  3. 从业务出发,来谈谈策略模式,清爽的飞起~
  4. [洛谷P4705]玩游戏
  5. mybatisplus查询今天的数据_MybatisPlus(CRUD)
  6. Java常见异常(Runtime Exception )小结
  7. Ubuntu NFS服务器的配置
  8. 十六进制转化为十进制
  9. oracle 只对成绩前三名进行排序其余不变_2021年采用美术统考成绩的重点院校名单汇总...
  10. Python中判断字符串中是否包含另一个字符串
  11. SourceTree的使用
  12. 《JavaScript高效图形编程(修订版)》——导读
  13. gif 动态加载_用 python 实现切割视频,加入水印,压缩并转成 gif !
  14. 100个C语言经典小程序和C语言编写的小游戏
  15. jmeter录制脚本
  16. SAP 系统图片修改以及 ABAP屏幕图片(大小调整)自适应设置
  17. 微型计算机m3500q,爆发“小”宇宙 创新与实用完美结合 ——联想ThinkCentre M3500q超小商用台式机新品发布...
  18. 产品经理常用的几种原型软件
  19. 记录使用QRCode 显示并下载二维码图片
  20. 出行必备:手机1秒调出健康码 !

热门文章

  1. HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)
  2. response设置content-type
  3. luogu cover
  4. Java 的类加载顺序
  5. SqlServer性能优化 自定义动化性能收集(四)
  6. PHP 数组变量之写时复制的要点 只有数组才有的概念。
  7. 白领丽人减肥四大注意 - 生活至上,美容至尚!
  8. 多域名虚拟空间及DNS配置
  9. [转]VC无负担实现XP风格界面
  10. IOS上传图片旋转90度问题出现原因及解决方案