groovyのExpandoMetaClassいじってるけど・・
おひさしぶりです。8月におもろそうなイベントがあるそうで、「ライヴコーディングバカですね、あなたは」と言われるであろう仕込みをしようかとgroovyをちょこちょこと。つか仕事しろオレってなかんじなんですけど。完全に逃避です。
ライブコーディングは仕込みの質で95%以上面白いかどうか(スマートかどうか)が決まります。なんでサクサクしたコーディングのためgroovyのMOP部分をみてますが、早速(昨日の夜中やりだして通算3時間余りで)「ん?」となってしまった。すげー初歩的かもしんないけどw
groovyからjavaのクラスを呼ぶ場合、同名のフィールド・メソッドを持ってるjavaクラス内でmetaClassからフィールド・メソッドそれぞれを呼ぶにはどーしたもんなんでしょうか? しかもそれらを上書きしたいんですね(staticとそうでないのでやりかたかわると思うけど、両方知りたいです)。
これって前にjrubyからp5を動かそうとしたときに「なんかメソッドが動かんぞ問題」に直面し、最近jrubyからp5を叩くというおもろいものを見たら、バッチリと同名のフィールドとメソッドがあるプロップにエイリアスをつくって参照してて、そーかjavaクラスに同名フィールド・メソッドがあるから呼べねーんじゃんと最近気づいたわけなんですよ。
方針としては
- getPropertyやinvokeMethodでごにょごにょ
- 別名をつけてごにょごにょ
- ExpandoMetaClassに別の名前でそれぞれをクローンしてしまう
ぐらいなのかしら。読まれてる方で他にアイデアがある方がいらっしゃいましたらご一報いただけるとこれ幸いです。
これになりそうなかんじ。
- javaクラスに定義されるmethodはいじらないで、defでgroovyクラスに定義したmethodのwrapperとして使ってgroovyクラスのmethodの中身を変更していく。fieldもgetPropertyとsetPropertyでごにょごにょしてgroovyクラスで定義したfieldをいじくる
ただ今書いてるかんじだとdefでgroovyに定義したmethodの挙動を変更するたびにExpandoMetaClassをnewしてinitializeしてるかんじなので、ちょっとダサい気がすごくする・・ もうすこしきれいにやらんとさすがにソースさらせないなー