经常会使用到的C语言中反射的特性
作者:bea
反射总体上分成两大特性,一是自省,二是发射;
自省的能力极为重要,而且几乎会天天用到,很少见到过哪个。net应用中不使用attribute的,而attribute特性就是metadata通过在自省能力支撑下实现的;当然自省不单单是attribute特性的运用,只要是在运行时动态检视程序自身的特性都要由反射的自省能力来支持,比如Visual Studio的IDE(这个集成开发环境本身就是。net应用的好案例)对于。net组件的自动探测功能;同时,自省的能力也是基于虚拟机平台的语言,比如c#和java,区别于传统语言比如c和c++的重要特性之一,这提供了程序设计开发更为便利和安全的运行时环境;相对而言,在c++(当然是native而不是managed)的环境下,除了RTTI极为单薄的运行时自省,也就是QT这个库通过meta-object system部分模拟了自省的特性;
反射的另外一个重要特性就是发射,它让“程序可以写程序”了,简要的说就是在运行时动态生成MSIL并加载运行以及持久化动态生成的MSIL的能力;由这个特性的支持,让原先一些程序设计和开发领域相对困难和繁琐的工作,比如元编程meta programming,比如动态代理dynamic proxy,比如AOP中的基础设施weaver的实现,变得可能或相对易于实现;反射的特性,也是基于虚拟机平台CLR的支持,以metadata为基础来实现的,所以这也是虚拟机平台语言的特有优势,而在传统语言平台上,这是难以实现的;比如关于meta programming,c++就是通过模板特性实现的编译期meta programming,这与虚拟机平台上实现的运行时meta programming还是有比较大的差距(比如前者如何保证生成的代码的type-safe);
以上这两个特性,自省和发射,都有个共同点,他们都是围绕着metadata机制,并在虚拟机平台运行时环境CLR支持下实现的,前者是运行时检视相关的metadata,后者是运行时动态生成相关的metadata和MSIL;从这点也就可以看出,要想深入理解这些特性,就需要研究metadata和MSIL的实现,以及虚拟机运行时环境的实现(在java平台上,就是bytecode和JVM);
所以,反射,可能是虚拟机平台所提供的相对最为强劲,最为复杂,和平台运行时本身关系最密切,也是区别于传统语言和运行时最鲜明的特性。
有用 | 无用猜你喜欢
您可能感兴趣的文章:
- 精简SQL语句,使MySQL更有效
- 介绍几款MySQL性能测试工具
- 远程连接MySQL出现错误提示分析
- 无法远程登录MySQL怎么办
- 怎样向MySQL数据表中插入数据
- 介绍几个备份MySQL数据库的方法
- 怎样保护MySQL中重要的数据
- MySQL数据库常用命令大全
- 修改visual c++ 6.0默认代码字体和大小
- 编程经验分享:如何学习C语言
- C语言可以做什么 C语言的应用方向
- 编译C程序提示缺少mspdb60.dll文件
- Linux平台C语言开发必须学习的知识
- Linux系统配置c/c++开发环境详解
- 详解C语言中关于string的函数(二)
- 详解C语言中关于string的函数(一)
- 详解C/C++中关键字static
- C语言中指针的地址是如何分配的
- void类型以及void指针的使用方法