uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

EMCでメソッドを置き換える際にもとのメソッドを呼び出したい

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です。