0

从以前的帖子中我发现动态调用默认方法的方法如下:

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()',并且一个子接口覆盖了这个方法,那么调用默认方法的机制总是只调用一个在基类上。

4

1 回答 1

0

只是为了更新,我设法以不同的方式解决它。因此,基本上我通过其代理跟踪当前对象,因此我通过反射获得了正确的(派生)方法并对其执行 MethodLookup,这很好。谢谢!

于 2016-06-17T07:04:17.987 回答