アサーションのコンパイル(アサーションをアスペクト&メタデータで実装)

Groovyのスクリプトバイトコードコンパイルすることができます.
GroovyラボGroovyの埋め込みによると,GroovyClassLoaderを使えばいいみたい.
GroovyスクリプトGroovyClassLoaderに渡すと,GroovyObjectimplementsしたクラスがダイナミックに作られて,そのClassが返されるので,newInstance()すれば,インスタンスを得ることができる,と.
そしてinvokeMethod(String method, Object args)runというメソッドを呼び出せば,スクリプトを実行できるらしい.
Bindingはどうするんだろう? スクリプトから利用できるように変数を設定してGroovyShellのコンストラクタに渡していたあのBindingを,GroovyObjectに渡すには?
どうやら,Bindingではなく,そのキーと値のペアをsetProperty(String name, Object newValue)で設定しろということらしい.うーむ.面倒だな.
なんか,もう少し使いやすい方法はないのかなぁ? ということでJavaDocを眺めてみたところ,なぁんだ,GroovyShell#parse(String)なんてのがあるじゃないですか.
これにスクリプトを渡すと,中ではGroovyClassLoaderが呼び出されて,コンパイルして得られるGroovyObjectをラップしたScriptインスタンスが返ってきます.じゃなくて,コンパイルされてできるクラスはScriptのサブクラスらしい.
Scriptクラスには,setBinding(Binding)メソッドがあります.さらにrun()メソッドもあるので,こっちの方が扱いやすそう.
ただ,この場合でもsetBinding(Binding)run()は排他的に実行しないといけないと思われるので,synchronizedする必要がありそう.run(Binding)でスレッドセーフに実行というわけにはいかないのですかねぇ.まっいっか.