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 をどうぞ。