为啥 Groovy 的地图没有 metaClass?

Posted

技术标签:

【中文标题】为啥 Groovy 的地图没有 metaClass?【英文标题】:Why Groovy's map does not have metaClass?为什么 Groovy 的地图没有 metaClass? 【发布时间】:2013-04-10 06:36:18 【问题描述】:

为什么 Groovy 的文字映射没有元类?

// lists work as expected:
aList = []
println aList.class // class java.util.ArrayList
println aList.metaClass  // gives the full blown metaclass
          //     org.codehaus.groovy.runtime.HandleMetaClass@3de6696c
          //     [groovy.lang.MetaClassImpl@3de6696c[class java.util.ArrayList]]

// string and numbers too:
println ''.metaClass
println 12.metaClass

// map does not:
aMap = [:]
println myMap.metaClass // gives null
println myMap.class // also gives null

测试:

Groovy Version: 1.8.6 JVM: 1.6.0_31 Vendor: Sun Microsystems Inc. OS: Linux

【问题讨论】:

【参考方案1】:

你必须使用:

[:].getMetaClass()

就像你想得到一个Mapclass一样,即:

[:].getClass()

这是因为当您在地图上进行属性查找时,地图会返回由给定键表示的值。否则你无法拥有classmetaClass 的密钥

【讨论】:

在相关主题上,有没有办法为实现 map 的类使用 missingProperty ?好的,我会发布另一个问题... 见***.com/questions/29042449/…

以上是关于为啥 Groovy 的地图没有 metaClass?的主要内容,如果未能解决你的问题,请参考以下文章

scala 中 Groovy 的 classX.metaClass.getProperty

GroovyMOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )

Spock 不使用 Groovy MetaClass 对待测服务的更改

GroovyMOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )

重写构造函数中调用的方法时,Groovy metaClass 失败?

GroovyMOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法实现函数拦截 | 实现函数调用转发 )