Groovyで動的にメソッドを生やす
インスタンスにメソッドを生やす
class EmptyCat {} def cat = new EmptyCat() cat.metaClass.nyan = { return 'meow' } cat.nyan() // => 'meow'
インスタンスの metaClass
からMetaClass (HandleMetaClass) を引っ張ってきて,それ経由で生やしたいメソッドの名前を指定し,Closureを代入してやると良い.
インスタンスメソッドとして生やす
上記がインスタンス自体にメソッドを生やしていたのに対し,こちらはクラスに対してメソッド追加の処理を行い,そのクラスがinstantiateされた際にそのメソッドを利用可能にするという方法.
class EmptyHuman {} EmptyHuman.metaClass.greet = { return '無……' } def human = new EmptyHuman() human.greet() // => '無……'
クラスの metaClass
からMetaClass (ExpandoMetaClass) を引っ張ってきて,それ経由で生やしたいメソッドの名前を指定し,Closureを代入してやると良い.
クラスメソッドとして生やす
class EmptyDog {} EmptyDog.metaClass.static.wan = { return 'bow' } EmptyDog.wan() // => 'bow'
クラスの metaClass.static
からMetaClass (ExpandoMetaClass) を引っ張ってきて,それ経由で生やしたいメソッドの名前を指定し,Closureを代入してやると良い.