元对象

在计算机科学中，元对象（metaobject）是操纵、创建、描述或实现对象（包括自身）的对象。适用于元对象的对象叫做基础对象。元对象可以定义的一些信息包括：基础对象的类型、接口、类、方法、特性、解析树等。元对象是计算机科学反射概念的例子，这里的系统（通常在运行时间）能访问它自己的内部结构。反射在根本上确使一个系统能现场重写自身，在其运行时改变自己的实现。

元对象协议 
元对象协议（MOP：metaobject protocol）提供了访问和操纵对象系统的结构和行为的词汇表（协议）。元对象协议的典型功能包括：
创建或删除一个新类，
创建一个新属性或方法，
致使一个类继承自一个不同的类（“变更类结构”），
产生或变更定义一个类的方法的代码。

进一步的说，元对象协议不只是到底层实现的接口，转而，通过元对象协议，对象系统是依据元对象系统而递归实现的，而它自身在理论上是依据元-元对象系统来实现的，以此类推直到任意一个基础情况（对象系统的一个一致性）被确定，协议就自身而言，是在这些实现层级之间的递归泛函联系。

元对象协议对立于伯特蘭·邁耶的开闭原则，它声称软件对象系统，应当“开放扩展”而“关闭修改”。这个原则有效的划分了，对其做出增加的扩展对象，和对其重定义的修改对象之间的不同，提出前者是需要的品质（“对象应当可以扩展来满足将来使用情况的要求”），而后者是不需要的（“对象应当提供拒绝概要修订的稳定的接口”）。元对象协议与之相反，透明的暴露对象的内部构成，和就系统自身而言的整个对象系统。实际上，这意味着编程者可以使用对象来重定义自身，可能要以非常复杂的方式。

以元对象协议方式实现对象系统，开放了彻底自主的重新设计的可能性，提供了深度灵活性，但介入了可能的复杂性，和难以理解的元稳定性问题（例如，对象系统不可以破坏性更新它自己的元对象协议，这是它的内部自我表示，但是某些更新的潜在破坏性要预测出来，是件不平凡之事，并可能难以推理），这依赖于想要的修改所传播到的递归深度。由于这些原因，当元对象协议出现于一个语言之中的时候，通常被适度使用并用于特殊用途，比如以复杂方式转换其他软件或自身的软件，例如在逆向工程中用到的那些软件。

运行时间和编译时间 
在于运行时间不能获得编译的时候，元对象协议的实现就有额外的复杂性。例如，有可能通过这种协议变更类型层级，但是这么做可能导致，用可替代类模型定义编译的代码出问题。一些环境找到了有创意的解决方法，比如通过在编译时间处理元对象问题。一个好例子是OpenC++。语义网的面向对象模型，比多数标准对象系统更加动态，并一致于运行时间元对象协议。例如，在语义网中模型类被预期变更它们的相互关系，并有叫做分类器的一个特殊的推论引擎，可以验证和分析演化中的类模型。

用途 
第一个元对象协议，是在Xerox PARC开发的面向对象编程语言Smalltalk之中的元类。随后的Common Lisp对象系统（CLOS），受到Smalltalk协议，还有在3-Lisp作为求值器无穷塔上的原创研究的影响。CLOS模型，不像Smalltalk模型，允许一个类有多于一个超类；这引起了额外的复杂性，比如有解决某些对象实例的类沿袭（lineage）的问题。CLOS还允许动态多方法分派，这是通过泛化函数来处理的，而非Smalltalk的单一分派中的消息传递。描述Common Lisp中元对象协议的语义和实现的最有影响的图书，是等人的《》。

元对象协议还广泛的用于软件工程应用中。在几乎所有的商业CASE、代码重构和集成开发环境中，都有某种形式的元对象协议，用来表示和操纵设计工件。

元对象协议是实现面向切面编程的一种方式。很多MOP的早期创立者，包括，此后成为了面向切面编程的主要倡导者。PARC雇用了Kiczales等人，为不拥有原生元对象协议的Java设计了。

参见

元类

OpenC++
统一建模语言：UML

引用

外部链接
 The Guile MOP specification (GOOPS, based on Tiny CLOS) 
 Metaobjects and the Metaobject Protocol 
 Common Lisp Object System Metaobject Protocol   (contains two chapters from The Art of the Metaobject Protocol)
 Python 2.6 Metaprogramming 

面向对象的程序设计
数据类型