21 元对象协议

1       元对象协议

1.1  什么是元对象协议?

基于Groovy的The Meta-Object Protocol (MOP) ,允许你在运行时,向一个对象里添加属性和方法。使用MOP,你能在运行时向一个已经存在的对象中新增方法和属性。

1.2  调用groovy对象的方法或者访问该groovy对象的属性

一个类中,一个方法被调用或者一个属性被访问,并且该类并没有这个方法或者属性,那么预先定义的方法被调用来处理这个调用。

  • def methodMissing (String name, args) – 调用不存在的方法
  • void setProperty (String property, Object o) – 调用一个属性中的不存在的setter方法
  • Object getProperty (String property) -调用一个属性中的不存在的getter方法

以上预定义的方法,Groovy对象实例有默认的实现,但是Groovy对象能重写这些方法。在运行时,如果一个方法或属性不存在,则Groovy框架会调用以上方法。例如,使用Groovy的builder模式,会假装认为有该方法。

1.3  增加方法和属性

使用.metaclass ,来向一个已经存在的类中新增方法和属性。


package mop

class MopTest {

static main(args) {

Todo.metaClass.summary = ‘Learn MOP‘

Todo.metaClass.done = false

Todo.metaClass.markAsFinish = {-> done=true}

Todo t = new Todo()

t.markAsFinish()

println(t.done);

}

}

class Todo {}

注意:class Todo {}必须放在class MopTest的后边,否则报错。

输出


true

时间: 2024-07-29 01:42:28

21 元对象协议的相关文章

22 例子:元对象协议

1       例子:元对象协议 1.1  练习目标 使用MOP扩展类. 1.2  创建一个Groovy对象并返回所有方法和属性调用 创建一个Groovy类.当每个属性被访问时,会假装方法调用,并返回一个固定值. package mop class AnyMethodExecutor { //忽略了getter方法 String value="Lars"; //总是返回5,不管传入的是什么property Object getProperty(String property) { re

Qt 元对象系统(Meta-Object System)

(转自:http://blog.csdn.net/aladdina/article/details/5496891) Qt的元对象系统基于如下三件事情: 类:QObject,为所有需要利用原对象系统的对象提供了一个基类. 宏:Q_OBJECT,通常可以声明在类的私有段中,让该类可以使用元对象对象的特性,比如动态属性,信号和槽. 编译器:元对象编译器(moc)为每个QObject子对象自动生成必要的代码来实现元对象特性. moc工具会读入C++的源文件,如果它发现了一个或者多个声明了Q_OBJEC

深入了解Qt(二)之元对象系统(Meta-Object System)

深入了解Qt主要内容来源于Inside Qt系列,本文做了部分删改,以便于理解.在此向原作者表示感谢! 在Qt Meta Object System-元对象系统这篇文章中,从底层实现的源码剖析了元对象系统的机制,在这里就做一些补充. Meta Object System的设计基于以下几个基础设施: QObject类,作为每一个需要利用元对象系统的类的基类.也就是说只有继承QObject类才能使用MOS. Q_OBJECT宏,定义在每一个类的私有数据段,用来启用元对象功能,比如,动态属性.信号和槽

元对象、 属性 和 反射编程

所谓反射,就是指对象成员的自我检查,使用反射编程就可以编写出通用的操作,可对具有各种不同结构的类进行操作; Qt使用通用的值存储器QVariant,就可以按照一种统一的方式来对基本类型和其他普通类型进行操作; QMetaObject  ---- 元对象模式 元对象,就是描述另一个对象结构的对象; QMetaObject是元对象模式(MetaObject Pattern)的一个Qt实现,他提供一个QObject对象拥有的属性和方法的信息.      一个拥有元对象的类就可以支持反射,这是一个许多面

Python的对象协议

Python是一门动态语言,Duck Typing概念遍布其中,所以其中的Concept并不是以类型的约束为载体,而是使用称作为协议的概念.那什么是Duck Typing呢? Duck Typing是鸭子类型,在动态语言中用的较多,是动态类型语言设计的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口决定,而是由当前方法和属性的集合决定.说白了就是并不关心对象是什么类型,只关心行为. 这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试(见下

QT元对象系统简介

 QT元对象系统   qt的主要成就之一就是使用了一种机制对C++进行了扩展,并且使用这种机制创建了独立的软件组件,这些组件可以绑定在一起,但任何一个组件对于它所要连接的组件的情况一无所知,这种机制就称为元对象系统,它提供了关键的两个技术,信号和槽,以及内省.     内省功能对于实现信号和槽是必须的,并且容许开发人员在运行时获取有关QObject子类的"元信息",包括一个含有对象的类名以及它所支持的信号和槽的列表,这一机制也支持属性和文本翻译,并且为Qtscript模块奠定了基础,标

Qt笔记——元对象系统

Qt元对象系统提供了对象间的通信机制:信号和槽.以及执行类形信息和动态属性系统的支持.是标注C++的一个扩展,它使得Qt可以更好的实现GUI图形用户界面编程.Qt的元对象系统不支持C++模板.虽然模板扩展了C++的功能,可是元对象提供了模板无法提供的一些特性. Qt的元对象基于三个事实: 1. 基类Q_OBJECT,不论什么想使用元对象系统功能的类必须继承自QOBject; 2. Q_OBJECT宏,Q_OBJECT宏必须出如今类的私有声明区,以完毕元对象的特性. 3. 元对象编译器(Meta-

什么是Qt元对象系统

Qt元对象系统,即meta object system(mos),提供了大家熟知的用于对象间信息传递的信号与槽机制,运行时类型信息和动态属性系统. mos基于三件法宝: 一是QObject类,是所有Qt对象的基类,可以很好的使用mos. 二是Q_OBJECT宏,在类private部分声明,用于激活mos特性,例如动态属性.信号与槽. 三是元对象编译器,即meta object compiler(moc),为QObject的派生类提供了必要的代码以实现mos特性.例如Example.h中声明了Ex

Qt根据类获取对象(元对象反射)

在java语言中,可以使用getObject(String)函数,从类型直接构建新的对象. 而在C++中是没有这种机制的,Qt虽然提供了元对象机制,但只可以获取对象的类名,不能反向构建. 这个问题我在百度上找了很多,但都没有满意的答案,索性翻出去google一下,终于找到了解决方法. 原文地址:http://www.mimec.org/node/350 代码如下: objectfactory.h #include <QByteArray> #include <QMetaObject>