`

深入浅出话反射——明明白白我的心

 
阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>

深入浅出话反射——明明白白我的心

小序:

今天是2007年2月14日星期三,情人节。
情人节,多美好的节日啊,它不是一个因为地球公转而存在的节日,它的存在是为了爱。命中注定,我要一个人安安静静度过这个节日。清晨,我被柔和而明亮的阳光从睡梦中唤醒——好个晴空朗日的情人节啊!匆匆出了家门直奔地铁站,当我走过离城铁站不远的桥边,一声清脆的叫卖穿透车水马龙的嘈杂、直击耳鼓沁入心中——“卖花儿嘞!情人节的鲜花儿!”——循声望去,一个女孩捧着一大束鲜红的玫瑰站在桥头,那束火一样奔放的玫瑰足以让周围一切哑然失色。
我加快脚步向地铁站走去。不知是姑娘在继续叫卖,还是刚才的声音回荡在心里,那余音总是挥之不去,而这袅袅的余音又仿佛把我带回了老北京城……二环路不见了,波光粼粼的护城河边是高耸的城墙;地铁站不见了,取而代之的是城门楼、土路、四合院儿,还有挑着各种帆幌的店铺。由远及近的马铃声串起一段段京韵京腔的吆喝。空气中还飘满各种早点小吃的香味儿。我的身上好像也套上了一件长衬棉袍、围了一条长长的围巾,手里拎的也不再是那台DELL640,而是一个鼓鼓的公文包。
“卖花儿嘞!”又是一声清脆的吆喝,我轻轻问自己——这是老北京的卖花儿姑娘的声音穿越了时空,还是……驻足思索间,一个影子快速地擦身而过——有钱人都是坐这个上班的——黄包车,京B牌儿,哟!还是个SONATA捏……

正文:

一.什么是反射(Reflection)

在程序开发中,反射着实是个很酷的概念。为什么酷?因为反射是个物理名词吗——你把它放到程序设计里,一上来谁也听不懂,当然很酷啦!有多酷呢?反正我知道N多公司面试的时候都喜欢拿这个东东说事儿。你别说,有些设计模式的实现还真离不开使用反射。这么酷的东西,怎么可以不会呢?
什么是反射呢?简言之就是软件开发中的“读心术”啦!比如我是一个DLL文件,我心里想的是:“明明白白我的心,渴望一份真感情……神啊救救我吧!”;而你会“读心术”,当你看到我的时候,我虽然没有开口告诉你,你却一眼就看穿我藏在心底的秘密、知道我在想什么了,就好像你的目光能穿透我的身体再反射回你眼里一样。反射就是这么得名滴——不但酷,还挺浪漫。

二.为什么需要反射

用一句话来说,那就是——为了使软件具有良好的伸缩性(Make Software Flexible)。喔!又一个很酷的概念!软件又不是天线杆,怎么个“伸缩”法呢?

  • 伸:指的是软件功能的扩展。比如:为一个软件开发插件,为它增加新的功能。
  • 缩:指的是软件功能的削减。比如:软件的试用版、低付费版或者在使用者权限不够时,把相应的功能禁止或者去掉。

你可能会问:以前没有.NET和反射的时候,难道软件就没有伸缩性了吗?当然有,只是实现起来要麻烦多了,比起实现对功能的扩展和削减来,将扩展和削减结果交付给客户(也就是软件的部署)会更加麻烦。

举个例子:你使用VC写了一个小软件(使用VB/Delphi等原生Win32 App工具情况是一样的),现在有一万个人在用。你为这个小软件增加了一个新功能,而且这个新功能在主菜单里有一个菜单项。那么为了让这一万个用户都能使用这个新功能,你就不得不为这个新功能开发一个安装包(补丁包),让这一万个人都安装一下它才能得到这个软件得到升级。在Windows平台上,这个补丁包要做的事情有两件:

  • 用新的主界面(EXE)替换旧的
  • 把包含新功能的模块(DLL)拷贝到恰当的目录下(鬼知道用户们都是怎么安装的软件)

这样做就麻烦多多了:

  • 首先是安装包的制作:这可都是成本、都是Bug的来源!看看微软有多少人在测试各个版本、各个语言的安装包(场面很壮观的)你就知道了。
  • 然后是用户的安装体验:用户可不都是程序员,会不会安装是一说、喜欢不喜欢安装是另一说。再赶上哪位仁兄安装的目录比较怪,这补丁打上去后让系统死翘翘也不是不可能。
  • 安全问题:安装包肯定是EXE吧,是EXE就有可能成为病毒的载体耶!想象一下,用户安完我的补丁包后——咦!好多的熊猫耶!——那我真是跳进太平洋也洗不清了,估计后半生都得躲到火星上过了。

也许你会问——照你这么吓唬人,软件升级岂不是做不成了?当然不是啦!各大厂商都有自己的高招。比如M$,是通过使用COM组件技术(每个COM组件都实现了统一的接口,ActiveX算是COM的一种,IE的插件就是ActiveX的)结合配置文件和注册表,来让软件升级的开发和部署过程变得统一,同时使用在线更新技术把安装过程隐藏起来(只是隐藏,仍然还是使用EXE安装);Adobe则是使用了PICA架构(基于C++资源文件实现的统一接口),方便开发人员为Photoshop、Illustrator等产品开发滤镜和插件,使用PICA架构开发出来的插件直接拷贝到特定的文件夹下就能被加入主框架。但是,这些办法只能是让软件的伸缩“不那么痛苦”,并不能让软件达到“伸缩自如”的地步。

想要理解清楚这个,就要从程序的编译和反射的实现原理入手。

三.反射的实现原理

在以Java为先锋“虚拟机”技术流行起来之前,构成计算机应用程序的文件(如EXE、DLL)里包含的内容就是可以被计算机CPU直接识别和使用的二进制指令和数据。当用户通过双击/命令行来运行程序的时候,Windows的程序加载器就是将文件数据读入内存并进行简单的映射——映射成为程序的数据段、代码段等,然后让程序开始执行(如果程序已经被病毒感染,那么病毒代码也一并执行,CPU并不能识别一段代码是游戏还是病毒)。这种文件遵循PE(Portable Executable)格式,又可以直接被CPU执行,所以我们称之为“原生PE文件”。

开发这样的程序使用的典型语言是C/C++,其它如VB/Delphi等与其用法大同小异。程序的开发步骤,从质的不同上可以分为三个“期”,可别小看这三个期,它们是非常重要的——

  1. 设计编码期:包括了数据、算法、逻辑、类抽象及设计、架构分析、编码几道工序。这时候,程序的代码就是文本文件。
  2. 编译链接期:包括了预编译、编译(可能是文本代码、汇编代码、二进制代码库的混编)、链接几道工序。
  3. 调试执行期:进行Debug或者最终用户的使用。

编译期虽然是这三期中耗时最短的一期,但作用却是决定性的。一旦编译成功(没有出现编译期错误),源代码就被编译成原生PE文件,这就意味着程序已经“烧结固化”了,文件与文件之间的依赖关系也固定了下来——伸缩性的限制正来源于此。而且,这种被“烧结固化”的PE文件中所包含的函数与它的在设计编码期的“样子”比起来,已经面目全非了:

===========================================
……
520 207 0005E079 PrintWindow
521 208 00030D5C PrivateExtractIconExA
522 209 0000B6AD PrivateExtractIconExW
523 20A 0004F724 PrivateExtractIconsA
524 20B 0000D06C PrivateExtractIconsW
525 20C 0001704A PtInRect
526 20D 0005E08D QuerySendMessage
527 20E 0005E0A1 RealChildWindowFromPoint
528 20F 0005C250 RealGetWindowClass
……
============================================

这是从USER32.DLL文件里Dump出来的一些函数。你会发现,除了函数名得以保留之外,函数的返回值类型、参数个数和类型等都已经“丢失”了。或者说,在这个DLL里到底有些什么东西,这个DLL文件自己也说不清楚(不具有“自描述性”)。在这种情况下,如果想在其它项目中复用这个DLL文件,你就必需拥有一个与之配套的头文件(USER32.H)帮助它来说清楚文件里都有些什么——C/C++是静态语言,在编译的时候一定要知道函数的类型和参数列表才肯干活。这一情况对于EXE、DLL、LIB(静态库)是一样的。

写累了,抽空接着写。
TO BE CONTINUE



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1510216


分享到:
评论

相关推荐

    前18大旋转修整器企业占据全球87%的市场份额.docx

    前18大旋转修整器企业占据全球87%的市场份额

    Planet-SkySat-Imagery-Product-Specification-Jan2020.pdf

    SKYSAT IMAGERY PRODUCT SPECIFICATION PLANET.COM VIDEO Full motion videos are collected between 30 and 120 seconds by a single camera from any of the active SkySats. Videos are collected using only the Panchromatic half of the camera, hence all videos are PAN only. Videos are packaged and delivered with a video mpeg-4 file, plus all image frames with accompanying video metadata and a frame index file (reference Product Types below)

    Screenshot_20240506_133458_com.netease.yhtj.vivo.jpg

    Screenshot_20240506_133458_com.netease.yhtj.vivo.jpg

    2019年A~F题特等奖论文合集.pdf

    大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,历年美赛特等奖O奖论文

    雷达物位变送器安装和操作手册

    雷达物位变送器安装和操作手册

    node-v11.6.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Python3实现快速排序(源代码)

    快速排序是一种基于分治策略的排序算法,通过选择一个基准元素,将待排序的数组划分为两个子数组,一个包含所有小于基准的元素,另一个包含所有大于基准的元素,然后递归地对这两个子数组进行快速排序。快速排序在平均情况下具有O(n log n)的时间复杂度,是一种非常高效的排序算法。然而,在最坏情况下,当输入数据已经有序或接近有序时,快速排序的性能会退化为O(n^2)。此外,快速排序是不稳定的排序算法,即相等的元素可能在排序过程中改变相对位置。尽管如此,快速排序仍然因其高效的平均性能而在实际应用中广泛使用。在Python3中,可以通过递归或迭代的方式实现快速排序算法,但为了避免额外的空间开销,通常会采用原地排序的方式来实现。

    毕业课设基于51单片机的出租车计价器(昼夜)

    【作品名称】:基于51单片机的出租车计价器(昼夜) 含(程序、仿真图、流程图、原理图) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 出租车计价器: 1、不同情况具有不同的收费标准,具有白天和夜晚不同的计价能力 2、能进行手动修改单价 3、具有数据的复位功能(起步价,起步公里数,里程单价,白天晚上不一样) 4、能够在掉电的情况下存储单价等数据 5、步进电机模拟里程,一圈表示一里路

    2024年中国API 11P往复式气体压缩机行业研究报告.docx

    2024年中国API 11P往复式气体压缩机行业研究报告

    Windows 10系统上安装和配置Tomcat的步骤

    附件是Windows 10系统上安装和配置Tomcat的步骤,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

    广东工业大学《计算网络A》实验报告期末考试试题回忆版.doc

    此试题是考试后回忆版本,你会发现是惊喜。恭喜你考个好成绩。

    数据库+人大金仓+Linux系统安装

    数据库+人大金仓+Linux系统安装

    2023年美赛特等奖论文-C-2309397-解密.pdf

    大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文

    opencv-python-4.5.4.60-cp36-cp36m-win-amd64.whl

    opencv-python-4.5.4.60-cp36-cp36m-win-amd64.whl

    减肥管理,全球前10强生产商排名及市场份额.docx

    减肥管理,全球前10强生产商排名及市场份额

    上海大学大学生创新创业训练计划申请书(创新训练项目).doc

    内容概要:《上海大学大学生创新创业训练计划申请书(创新训练项目)》是用于申请参加上海大学的大学生创新创业训练计划的申请书,旨在帮助学生提出创新项目计划,获得培训和支持,促进学生创新创业能力的提升。 适用人群:适合上海大学的在校大学生,特别是对创新创业感兴趣、有创新想法和创业计划的学生,希望通过该计划获得指导和资源支持,实现自己的创业梦想。 使用场景及目标:申请书的使用场景是为了参加上海大学的大学生创新创业训练计划,目标是通过提交详细的创新项目计划,获得评审通过并获得培训、指导和资金支持,从而推动学生的创新创业实践和能力提升。 其他说明:申请书应包括清晰的创新项目描述、项目可行性分析、预期目标和计划、团队介绍等内容,以展现学生的创新能力和项目潜力。申请书的撰写需要认真准备,体现出学生对创新创业的热情和才华,以提高申请成功的机会。

    IEC 60364-7-716-2023 第7-716部分:特殊装置或场所要求.信息和通信技术ICT电缆基础设施上ELV直流配电

    IEC 60364-7-716-2023 低压电气装置.第7-716部分:特殊装置或场所的要求.信息和通信技术(ICT)电缆基础设施上的ELV直流配电.pdf

    IEC PAS 61851-1-1 2023 电动汽车导电充电系统.第1-1部分:使用4型车辆耦合器电动汽车导电带电系统特殊要求

    IEC PAS 61851-1-1 2023 电动汽车导电充电系统.第1-1部分:使用4型车辆耦合器的电动汽车导电带电系统的特殊要求.pdf

    前11大客运渡轮服务企业占据全球30.3%的市场份额.docx

    前11大客运渡轮服务企业占据全球30.3%的市场份额

    wsl+MCgpu安装记录

    wsl+MCgpu安装记录

Global site tag (gtag.js) - Google Analytics