将名为metaClass的键放在Map中

时间:2010-10-19 09:01:54

标签: groovy map metaclass

我写了一个small Groovy script,暴露出一种非常奇怪的行为。任何人都可以解释一下吗?

// Creating a groovy map 
def map = [:] 
// Putting a value in 
map["a"]="b"
// Render it without trouble 
println map["a"] 
// Putting another value in (yup, this one has THE name) 
map["metaClass"]="c"
// Failing to render it 
println map["metaClass"]

我在这种情况下的问题很简单:为什么最后一条指令会抛出以下异常:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'c' with class 'java.lang.String' to class 'groovy.lang.MetaClass'
at Script1.run(Script1.groovy:8)

1 个答案:

答案 0 :(得分:4)

问题在于:

map["metaClass"]="c"

与写作相同:

map.metaClass = "c"

我猜测在委托Map.put(x,y)方法之前,它会检查对象上是否存在setXxxx方法。

由于存在一个名为setMetaClass()的方法(在Groovy中的每个对象中),它会调用此方法而不是在地图中设置属性(并且无法将"c"转换为metaClass对象,如你所见)

解决方法:

  • 没有名为metaClass
  • 的密钥
  • 使用map.put( 'metaClass', 'c' )代替groovy magic