ExpandoMetaClassを使って、メソッドを定義するときに、置き換える前のメソッドを呼びたいときがあります。あるんです。
以下やりかたです。置き換える前のメソッドを保存しておきます。
def old = Integer.metaClass.getMetaMethod("asType", [Class] as Object[]) Integer.metaClass.asType = { Class c -> if (c == String) { return "0x" + Integer.toString(delegate, 16) } Object[] args = new Object[1] args[0] = c old.doMethodInvoke(delegate, args) } println(20 as String) // ==> 0x14 println(20 as double) // ==> 20.0 //もとのasType()が呼ばれる
doMethodInvokeの第二引数を[c] as Object[]にしていない理由は、asTypeが再帰してしまうからで、一般にはそれでOKです。