以前の投稿から、デフォルトのメソッドを動的に呼び出す方法は次のとおりであることがわかりました。
final Class<?> declaringClass = method.getDeclaringClass();
final Constructor<Lookup> constructor =
MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, int.class);
constructor.setAccessible(true);
final MethodHandles.Lookup defaultMethodLookup =
constructor.newInstance(declaringClass, MethodHandles.Lookup.PRIVATE);
return defaultMethodLookup
.unreflectSpecial(method, declaringClass)
.bindTo(proxy)
.invokeWithArguments(args);
これは問題なく動作します。ただし、呼び出しが特定のメソッドをオーバーライドする派生インターフェイスからのものである場合、上記のコードは基本インターフェイスのメソッドを呼び出します。
したがって、問題は、「void fire()」などの基本インターフェースにデフォルトのメソッドがあり、サブインターフェースがこのメソッドをオーバーライドし、デフォルトのメソッドを呼び出すメカニズムが常に 1 つだけを呼び出す場合です。基本クラスで。