我写了一个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)
答案 0 :(得分:4)
问题在于:
map["metaClass"]="c"
与写作相同:
map.metaClass = "c"
我猜测在委托Map.put(x,y)
方法之前,它会检查对象上是否存在setXxxx
方法。
由于存在一个名为setMetaClass()
的方法(在Groovy中的每个对象中),它会调用此方法而不是在地图中设置属性(并且无法将"c"
转换为metaClass对象,如你所见)
解决方法:
metaClass
map.put( 'metaClass', 'c' )
代替groovy magic