JSONObjectのメタクラスをGroovyで修正して、通常のGroovyマップのようにできるだけ動作させようとしています。メタクラスにメソッドを実装すると、以下の例のJSONObject.metaClass.sizeのような単純なメソッドがあります。 JSONObjectにはlength()メソッドがあり、新しいsize()メソッドまで配線していますが、いくつかのメソッドには特別な意味があります。たとえば、添字割り当てを機能させるには、putAtではなく、propertyMissingをオーバーライドする必要がありました。それは、collect、findAllなどのようなコレクション操作の多くが似ているように見えます。Groovyメタクラスを使用して特殊メソッドを実装する
私の最初の質問は、それぞれの()を動作させるためにこの場合にどのような特別なメソッドを必要としますか?私の2番目の質問は、自分自身で答えをどうやって見つけ出すかです。 MOPから特別な扱いを受けるメソッドのどこかにリファレンスがありますか? groovy-coreのソースコードを見てみましたが、そこにはたくさんのものがあり、どこから始めるべきかわかりません。
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"}
?あなたは完全なクラス名を与えることができますか? – daggett
org.json.JSONArrayとorg.json.JSONObject from 'org.json:json:20160810' –