从以前的帖子中我发现动态调用默认方法的方法如下:
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()',并且一个子接口覆盖了这个方法,那么调用默认方法的机制总是只调用一个在基类上。