CLR完全介绍: 反射之反思

您清晰的组件化目标是否因在库间共享过多类型信息而落空?或许您需要高效的强类型化数据存储,但如果每次对象模型发展后都需要更新您的数据库架构,那会耗费很大成本,所以您更愿意在运行时推断出其类型架构吗?您需要交付能接受任意用户对象的组件,并以某种智能化的方式处理它们吗?您希望库的调方者能以编程方式向您说明它们的类型吗?

如果您发现自己在苦苦维持强类型化数据结构的同时,又冀望于最大化运行时灵活性,那么您大概会愿意考虑反射,以及它如何改善您的软件。在本专栏中,我将探讨 Microsoft .NET Framework 中的 System.Reflection 命名空间,以及它如何为您的开发体验提供助益。我将从一些简单的示例开始,最后将讲述如何处理现实世界中的序列化情形。在此过程中,我会展示反射和 CodeDom 如何配合工作,以有效处理运行时数据。

在深入探究 System.Reflection 之前,我想先讨论一下一般的反射编程。首先,反射可定义为由一个编程系统提供的任何功能,此功能使程序员可以在无需提前了解其标识或正式结构的情况下检查和操作代码实体。这部分内容很多,我将逐一展开说明。

首先,反射提供了什么呢?您能用它做些什么呢?我倾向于将典型的以反射为中心的任务分为两类:检查和操作。检查需要分析对象和类型,以收集有关其定义和行为的结构化信息。除了一些基本规定之外,通常这是在事先不了解它们的情况下进行的。(例如,在 .NET Framework 中,任何东西都继承自 System.Object,并且一个对象类型的引用通常是反射的一般起点。)

操作利用通过检查收集到的信息动态地调用代码,创建已发现类型的新实例,或者甚至可以轻松地动态重新结构化类型和对象。需要指出的一个要点是,对于大多数系统,在运行时操作类型和对象,较之在源代码中静态地进行同等操作,会导致性能降低。由于反射的动态特性,因此这是个必要的取舍,不过有很多技巧和最佳做法可以优化反射的性能(有关优化使用反射的更多深入信息,请参见 msdn.microsoft.com/msdnmag/issues/05/07/Reflection)。

那么,什么是反射的目标呢?程序员实际检查和操作什么呢?在我对反射的定义中,我用了“代码实体”这个新术语,以强调一个事实:从程序员的角度来说,反射技术有时会使传统对象和类型之间的界限变得模糊。例如,一个典型的以反射为中心的任务可能是:

从对象 O 的句柄开始,并使用反射获得其相关定义(类型 T)的句柄。

检查类型 T,获得它的方法 M 的句柄。

调用另一个对象 O’(同样是类型 T)的方法 M。

时间: 2024-10-31 00:23:24

CLR完全介绍: 反射之反思的相关文章

CLR 完全介绍: “Orcas”中新增的库类

下一版本的 Microsoft .NET Framework(将随附当前代号为"Orcas"的下一版 Visual Studio 提供)的程序集分为两组,内部称为"red bits"和"green bits".red bits 包括先前在 .NET Framework 2.0 和 3.0 中提供的所有库(例如,mscorlib.dll 和 system.dll).为了确保使 Visual Studio"Orcas"具有高度的向

对.NET Framework 反射的反思

清晰的组件化目标是否因在库间共享过多类型信息而落空?或许您需要高效的强类型化数据存储,但如果每次对象模型发展后都需要更新您的数据库架构,那会耗费很大成本,所以您更愿意在运行时推断出其类型架构吗?您需要交付能接受任意用户对象的组件,并以某种智能化的方式处理它们吗?您希望库的调方者能以编程方式向您说明它们的类型吗? 如果您发现自己在苦苦维持强类型化数据结构的同时,又冀望于最大化运行时灵活性,那么您大概会愿意考虑反射,以及它如何改善您的软件.在本专栏中,我将探讨 Microsoft .NET Fram

CLR完全介绍: 托管代码与非托管代码之间的封送处理

让我们面对现实吧.这个世界并不完美.几乎很少有公司在完全用托管代码开发程序,除此之外仍存在很多需要您处理的旧式非托管代码.您怎样将托管和非托管项目集成起来呢?在形式上是采用从托管应用程序调用非托管代码,还是从非托管代码应用程序调用托管代码? 幸运的是,Microsoft .NET Framework 互操作在托管和非托管代码之间开辟了一条通道,而封送处理则在该连接中扮演着非常重要的角色,因为它允许在两者之间进行数据交换(请参见图 1).有很多因素会影响 CLR 在非托管和托管领域之间封送数据的方

CLR 完全介绍: 编写可靠的.NET代码

当我们谈论某样东西具有可靠性时,我们是指它值得信赖,而且可以预测.但是就软件而言,还必须具备其他重要属性,才可以说代码具有可靠性. 软件必须具有复原性,意思是说在出现内部和外部中断情况时,它仍然可以继续正常运行.它必须是可恢复的,以便它知道如何将自己恢复到先前已知的一致状态.软件必须可预测,这样它会提供及时的预期服务.它必须不可中断,意思是更改和升级都不会影响它的服务.最后,软件必须是生产就绪的,意思是它包含最少的 bug,并且只需要进行数量有限的更新.如果满足了这些条件,那么软件就真正称得上可

CLR完全介绍: .NET的内部诊断工具

很多诊断工具都需要使用 CLR 分析 API,甚至包括那些在严格意义上讲不是探查器的工具.因此,如 果您曾经想知道这些工具是如何工作的,那么,了解 API 的分析会是个良好的开端.在本专栏中,您将 看到它们是如何工作的,并了解一些有用的提示和技巧.您还将在"其他分析资源"侧栏内找 到一些基本的资源. 若要使用 CLR 分析 API,需要使用非托管语言(通常是 C++)来创建 DLL,然后设置一些环境变量, 用于指导公共语言运行库 (CLR) 加载 DLL 并允许它使用分析 API.此

CLR完全介绍

发现和纠正托管应用程序中的内存问题可能十分困难. 内存问题的表现形式多种多样.例如,您会观 察到,您的应用程序的内存使用量在不断增加,最终导致"内存不足"(OOM) 异常(您的应用 程序甚至可能在有大量可用物理内存的情况下引发内存不足异常).但以下任何一种情况均表明内存可能 出现了问题: 引发 OutOfMemoryException(内存不足异常). 进程占用了太多内存,您无法确定任何明显 的原因. 似乎垃圾收集功能并没有快速清理对象. 托管堆碎片过多. 应用程序过 度占用 CPU.

Java反射机制的学习

Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Java反射机制没啥用.或许在J2EE.J2SE等平台,Java反射机制没啥用(具体我也不了解,不多做评论),但是在Android应用开发中,该

Go语言中反射的正确使用_Golang

介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力.不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型. 反射有两个问题,在使用前需要三思: 大量的使用反射会损失一定性能 Clear is better than clever. Reflection is never clear. Go的类型设计上有一些基本原则,理解这些基本原则会有助于你理解反射的本质: 变量包括 <type, value> 两部分.理解这一点你就知道为什么nil != nil了. t

[转载]使用反射技术动态创建类对象(实例代码)

经过数天的研究,终于能动态加载数据访问层了.虽然网上有不少介绍反射的文章,但都是从理论上来说的,没有一个特别详细的例子,所以一直没能写出实际代码.这里把自己的一段代码写出来,希望能够帮助像我一样的初学者快速上手,先应用,再深入,免得着急. 首先说一下基本信息,本例以对数据库中的一个表Sort(类别)的访问为基础.表结构就不说了,而且我也不想涉及到对数据库的具体操作,主要是看一下思路.关于反射的一些概念和基本常识,请参考相关文章,网上有写得非常好的,作者就不班门弄斧了. 首先创建几个存放类文件的目