使用Groovy元类实现特殊方法

使用Groovy元类实现特殊方法,groovy,dynamic-programming,metaclass,expandometaclass,Groovy,Dynamic Programming,Metaclass,Expandometaclass,我试图在Groovy中修改JSONObject的元类,使其行为尽可能类似于常规Groovy映射。当我在元类中实现方法时,其中一些方法非常简单,如下面示例中的JSONObject.metaclass.size。JSONObject有一个length()方法,我只是将它连接到一个新的size()方法,但有些方法有特殊的含义。例如,为了使下标赋值生效,我必须重写propertyMissing,而不是putAt。看起来很多收集操作都很相似,比如each、collect、findAll等 我的第一个问题是

我试图在Groovy中修改JSONObject的元类,使其行为尽可能类似于常规Groovy映射。当我在元类中实现方法时,其中一些方法非常简单,如下面示例中的JSONObject.metaclass.size。JSONObject有一个length()方法,我只是将它连接到一个新的size()方法,但有些方法有特殊的含义。例如,为了使下标赋值生效,我必须重写propertyMissing,而不是putAt。看起来很多收集操作都很相似,比如each、collect、findAll等

我的第一个问题是,在这种情况下,我需要重写哪些特殊方法才能使每个()都工作?我的第二个问题是,我如何自己找到答案?是否有从MOP获得特殊处理的方法的参考?我试图查看groovy核心源代码,但其中有很多代码,我不知道从哪里开始

JSONObject.metaClass.propertyMissing = { String name, newValue -> delegate.put(name, newValue) }
JSONObject.metaClass.size = { -> delegate.length() }
JSONObject.metaClass.each = { cl -> delegate.keys().collectEntries{ [(it): delegate[it] ]}.each(cl) }

def json = new JSONObject()
json['a'] = 999
json.b    = 2.2
json['c'] = 'the letter C'
println json['a']            // Prints 999
println json['b']            // Prints 2.2
println json.c               // 'the letter C'
println json.size()         // Prints 3

//No signature of method: ... $__spock_feature_0_0_closure4.doCall() is applicable 
json.each{ k,v -> println "$k = $v"}
输出:

999
2.2
the letter C
3
a = 999
b = 2.2
c = the letter C

哪个JSONObject?你能给出完整的类名吗?org.json.JSONArray和org.json.JSONObject来自'org.json:json:20160810',有效:)谢谢!我想我的方法或多或少是正确的,但我没有正确地编写每个闭包。
999
2.2
the letter C
3
a = 999
b = 2.2
c = the letter C