Groovy的MetaClass有什么用?

26

在Groovy和其他面向对象编程语言中,元类(Meta-Class)的用途是什么?

2个回答

44

你可能在想Groovy的MetaClass

Groovy中的MetaClass定义了任何给定的Groovy或Java类的行为。MetaClass接口定义了两个部分。客户端API是通过扩展MetaObjectProtocol接口定义的,与Groovy运行时系统的契约。通常情况下,编译器和Groovy运行时引擎与此类上的方法交互,而MetaClass客户端则与MetaObjectProtocol接口定义的方法交互。


Groovy MetaClass允许你在运行时向类赋予行为和状态,而不需要编辑原始源代码,它位于原始类的上层。

这是Groovy用来扩展Java JDK对象的机制。

示例:

Object.class.metaClass.explode{-> println "Boom! ${delegate} Exploded!"}
"SomeString".explode();
12345.explode();

输出:

砰!SomeString爆炸了!
砰!12345爆炸了!

要了解更高级的用法,请阅读此文:元类


2
在这种情况下,**${delegate}** 如何打印 somestring12345 - Ant's
6
“delegate”是元类所调用的对象。在第一个例子中,它是一个“String”,在第二个例子中,它是一个“Integer”。 - tim_yates
7
“delegate”是“this”的别名,因为在该上下文中,“this”的含义不同。“delegate”是调用方法的对象。 - Sean Patrick Floyd

6

来自于维基百科

在面向对象编程中,元类是一个其实例为类的类。就像普通类定义某些对象的行为一样,元类定义某些类及其实例的行为。并非所有面向对象编程语言都支持元类。对于支持元类的语言来说,元类能够覆盖类行为的范围各不相同。每种语言都有自己的元对象协议,这是一组规则,用于管理对象、类和元类之间的交互。

以及

语言和工具的支持

以下是一些支持元类的最著名的编程语言。Common Lisp,通过CLOS Groovy Objective-C Python Perl,通过元类pragma,以及Moose Ruby Smalltalk 一些不太常见的支持元类的语言包括OpenJava,OpenC++,OpenAda,CorbaScript,ObjVLisp,Object-Z,MODEL-K,XOTcl和MELDC。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接