在 Groovy 中,实例的元类与其类的元类有啥区别

Posted

技术标签:

【中文标题】在 Groovy 中,实例的元类与其类的元类有啥区别【英文标题】:In Groovy what's the difference between an instance's metaClass and its class's metaClass在 Groovy 中,实例的元类与其类的元类有什么区别 【发布时间】:2016-03-19 11:54:35 【问题描述】:

见以下代码:

class Car implements GroovyInterceptable
car=new Car()
Car.metaClass.hello=println "class Car:hello"
car.metaClass==Car.metaClass

结果是:

false

所以我的问题是:car.metaClass 和 Car.metaClass 有什么区别?我做了一些搜索,但没有结果。有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

car.metaClass 适用于名为car 的对象。你可以修改它,但它不会被其他Car对象看到

当你修改Car.metaClass时,这将适用于Car.class的所有对象(在这个新的元修改之后创建)

class Car implements GroovyInterceptable
car=new Car()

Car.metaClass.accelerate ->println "Factory tested. Safe acceleration"
car.metaClass.accelerate  ->println "Owner modified : Random acceleration"

def anotherCar= new Car();
anotherCar.accelerate()
car.accelerate()

输出

 Factory tested. Safe acceleration
 Owner modified : Random acceleration

【讨论】:

以上是关于在 Groovy 中,实例的元类与其类的元类有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

从它的元类python引用一个类的实例

理解python的元类

python 的元类

如何创建可以为类提供实例数组并提供作用于所有类实例的“巫毒”实例的元类?

关于廖雪峰提到的元类的应用实例的解释

TypeError:元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类