什么是Groovy的MetaClass用于?

Ant*_*t's 21 groovy

在Groovy和其他OO编程语言中使用Meta-Class有什么用?

Sea*_*oyd 37

Java中没有Meta-Class.您可能正在考虑Groovy的MetaClass:

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


Groovy MetaClass允许您在运行时将行为和状态分配给Classes,而无需编辑原始源代码,它是原始类之上的一层.

这是Groovy用于扩展Java JDK对象的机制.

例:

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

输出:

繁荣!SomeString爆炸了!
繁荣!12345爆炸了!

有关更高级的用法,请阅读:MetaClasses

  • `delegate`是调用metaClass的对象.在第一种情况下,它是一个`String`,然后是第二种情况,它是一个`Integer` (5认同)
  • `delegate`是`this`的别名,因为`this`在上下文中有不同的含义.`delegate`是调用该方法的对象. (5认同)
  • 在这种情况下,**${delegate}**如何打印**somestring**和**12345**? (2认同)

Bal*_*a R 6

来自维基百科

在面向对象的编程中,元类是一个类,其实例是类.正如普通类定义某些对象的行为一样,元类定义了某些类及其实例的行为.并非所有面向对象的编程语言都支持元类.在这些中,元类可以覆盖任何给定方面的类行为的程度各不相同.每种语言都有自己的元对象协议,这是一组管理对象,类和元类如何交互的规则.

支持语言和工具

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