22 例子:元对象协议

1       例子:元对象协议

1.1  练习目标

使用MOP扩展类。

1.2  创建一个Groovy对象并返回所有方法和属性调用

创建一个Groovy类。当每个属性被访问时,会假装方法调用,并返回一个固定值。


package mop

class AnyMethodExecutor {

//忽略了getter方法

String value="Lars";

//总是返回5,不管传入的是什么property

Object getProperty(String property) {

return 5;

}

void setProperty(String property,Object o) {

//忽略

}

def methodMissing(String name,args) {

def s = name.toLowerCase();

if(!s.contains("hello")) {

return "This method is just fake";

} else {

return "Still a fake method but ‘hello‘ back to you.";

}

}

}

使用下边的Groovy脚本来测试该方法。


package mop

class AnyMethodExecutorTest {

static main(args) {

def test = new AnyMethodExecutor();

//你能调用任何方法像下边这样

assert "This method is just fake" == test.hall();

assert "This method is just fake" == test.hallo();

assert "Still a fake method but ‘hello‘ back to you."==test.helloMethod();

assert "Still a fake method but ‘hello‘ back to you."==test.helloM();

//以下基本的属性设置会被忽略

test.test = 5;

test.superDuperCool = 100;

//所有的properties都会返回5

assert test.superDuperCool == 5;

assert test.value==5;

}

}

1.3  练习: 向Groovy类中增加json输出,笨方法和聪明的方法

创建下边的Groovy类。


package mop.json

import groovy.json.JsonBuilder

class Task {

String summary;

String description;

def methodMissing(String name,args) {

if (name == "toJson") {

JsonBuilder b1 = new JsonBuilder(this);

return b1.toString();

}

}

}

使用methodMissing 代表toJson 方法调用。这种实现是笨的方法,使用“框架”代码侵入了domain。

以下脚本触发json的生成。


package mop.json

class TaskTest {

static main(args) {

def t = new Task(summary:"Mop",description:"Learn all about Mop");

println (t.toJson());

}

}

输出


{"summary":"Mop","description":"Learn all about Mop"}

聪明的方法:Groovy允许创建一个MetaClass 实例,并且会自动的将其注册到指定类中。这个注册时基于包名转换的。

//在一个包中定义一个Metaclass的实例,Groovy将会注册到一个类中
groovy.runtime.metaclass.[thePackage].[theClassName]MetaClass 

注意:该代理类的包一定按照如上规则定义。

本例是:groovy.runtime.metaclass.包名,会自动注册到Task这个domain上的。因此,Task无需继承或实现等于该代理类关联。


package groovy.runtime.metaclass.mop.json2

import groovy.json.JsonBuilder

class TaskMetaClass extends DelegatingMetaClass {

TaskMetaClass(MetaClass meta) {

super(meta);

}

@Override

def invokeMethod(Object object, String method, Object[] args) {

println(method);

if (method == "toJson") {

JsonBuilder b1 = new JsonBuilder(object);

return b1.toString();

}

return super.invokeMethod(object, method, args);

}

}

这将允许你将domain中的def methodMissing(String name,args) {这个方法去掉了。


package mop.json2

class Task {

String summary;

String description;

}

再次运行这个简短的测试脚本并且验证转换成json的工作是否有效。


package mop.json2

class TaskTest {

static main(args) {

def t = new Task(summary:"Mop",description:"Learn all about Mop");

println (t.toJson());

}

}

输出


toJson

{"summary":"Mop","description":"Learn all about Mop"}

时间: 2024-10-19 21:24:13

22 例子:元对象协议的相关文章

21 元对象协议

1       元对象协议 1.1  什么是元对象协议? 基于Groovy的The Meta-Object Protocol (MOP) ,允许你在运行时,向一个对象里添加属性和方法.使用MOP,你能在运行时向一个已经存在的对象中新增方法和属性. 1.2  调用groovy对象的方法或者访问该groovy对象的属性 一个类中,一个方法被调用或者一个属性被访问,并且该类并没有这个方法或者属性,那么预先定义的方法被调用来处理这个调用. def methodMissing (String name,

Python的对象协议

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

Qt元对象系统源码解析

Qt元对象系统源码解析 https://blog.51cto.com/9291927/2070348 一.Qt元对象系统简介 1.元对象系统简介 Qt 的信号槽和属性系统基于在运行时进行内省的能力,所谓内省是指面向对象语言的一种在运行期间查询对象信息的能力, 比如如果语言具有运行期间检查对象型别的能力,那么是型别内省(type intropection)的,型别内省可以用来实施多态.C++的内省比较有限,仅支持型别内省, C++的型别内省是通过运行时类型识别(RTTI)(Run-Time Typ

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对象拥有的属性和方法的信息.      一个拥有元对象的类就可以支持反射,这是一个许多面

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