从之前的帖子中我发现动态调用默认方法的方法如下:
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()',子接口会覆盖这个方法,然后调用默认方法的机制总是调用只有基类上的一个。
答案 0 :(得分:0)
仅仅为了更新,我设法以不同的方式解决它。 所以,基本上我通过它的代理跟踪当前对象,因此我通过反射得到了正确的(派生的)方法并对其执行了MethodLookup,这很好。 谢谢!