mike-neckのブログ

Java or Groovy or Swift or Golang

Proxy の InvocationHandler から interface の default メソッドを呼び出す方法

  1. proxy を取得する対象のインターフェースクラスで MethodHandles.lookup() を呼び出して MethodHandles.Lookup を取得する
    1. で取得した MethodHandles.Lookupインスタンスから unreflectSpecial(Method, Class<?>) を呼び出して、MethodHandle を取得する
  2. proxy のインスタンスbindTo して invoke する

簡単に書いたが、 1. のところを間違えると、呼び出せない!ということになる。

MethodHandles#lookup() は呼び出したクラスが何であるかを保持するので、これが proxy 対象のインターフェース以外のクラスで実行すると、 java.lang.IllegalAccessException: no private access for invokespecial が発生する

コード例は stackoverflow をどうぞ。

stackoverflow.com