GroovyBeansのプロパティが便利!
Groovy いいよ、Groovy! (`・ω・´)
Groovy で
class HogeBean implements Serilizable { String hoge }
と書くと、Java でいう
public class Hoge implements java.io.Serializable { private String hoge; public String getHoge() { return this.hoge; } public void setHoge(String hoge) { this.hoge = hoge; }
と等価なクラスが出来ます。
ポイントは、Groovy がバイトコードエンハンスメントで本当にアクセッサを追加してくれる所。
つまり、Groovy 側のクラスを Java 側で呼び出す際は上記の書き方で完全な JavaBeans として認識される (`・ω・´)
ちなみに jad で逆コンパイルした際のアクセッサ周りがどんな感じになってるかってーと
import groovy.lang.GroovyObject; import groovy.lang.MetaClass; import java.io.Serializable; import org.codehaus.groovy.runtime.ScriptBytecodeAdapter; public class Hoge implements Serializable, GroovyObject { ... public String getHoge() { Class class1 = Hoge.class; Class class2 = groovy.lang.MetaClass.class; return (String)ScriptBytecodeAdapter.castToType(hoge, java.lang.String.class); } public void setHoge(String value) { Class class1 = Hoge.class; Class class2 = groovy.lang.MetaClass.class; value; (String)ScriptBytecodeAdapter.castToType(value, java.lang.String.class); this; JVM INSTR swap ; hoge; JVM INSTR pop ; } ... private String hoge; ... }
こんな感じ。
もちろん Groovy としてのコードも入ってるけど、ちゃんとアクセッサが準備されてるので Java から見れば普通の JavaBeans ですね。
追記
読み込み専用の JavaBeans ってどうすんだ? と思ったらちゃんと Groovyイン・アクション の 7.4.1 に載ってた!
class Hoge2 implements Serializable{ final String hoge2 }
ってすると、ゲッタのみ生成されるらしい。
jad でも確認してみたけど、ちゃんと
import groovy.lang.GroovyObject; import groovy.lang.MetaClass; import java.io.Serializable; import org.codehaus.groovy.runtime.ScriptBytecodeAdapter; public class Hoge2 implements Serializable, GroovyObject { ... public final String getHoge2() { Class class1 = Hoge2.class; Class class2 = groovy.lang.MetaClass.class; return (String)ScriptBytecodeAdapter.castToType(hoge2, java.lang.String.class); } ... private final String hoge2; ... }
ってなってた。
ちなみに Groovy 上で自分でアクセッサを書いた場合、バイトコードエンハンスメントでのアクセッサの追加は行われません。
上手い事作ってあるな〜。