Proxy の InvocationHandler から interface の default メソッドを呼び出す方法
- proxy を取得する対象のインターフェースクラスで
MethodHandles.lookup()
を呼び出してMethodHandles.Lookup
を取得する - で取得した
MethodHandles.Lookup
のインスタンスからunreflectSpecial(Method, Class<?>)
を呼び出して、MethodHandle
を取得する
- で取得した
- proxy のインスタンスを
bindTo
してinvoke
する
簡単に書いたが、 1. のところを間違えると、呼び出せない!ということになる。
MethodHandles#lookup()
は呼び出したクラスが何であるかを保持するので、これが proxy 対象のインターフェース以外のクラスで実行すると、 java.lang.IllegalAccessException: no private access for invokespecial
が発生する
コード例は stackoverflow をどうぞ。