【发布时间】:2016-10-12 11:55:08
【问题描述】:
从之前的帖子中我发现动态调用默认方法的方式如下:
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()',并且一个子接口覆盖了这个方法,那么调用默认方法的机制总是调用只有基类上的那个。
【问题讨论】:
-
第一行的方法从何而来?
-
@waltersu 它是调用处理程序的
invoke方法的参数。上面的代码在调用处理程序中。
标签: java dynamic reflection metaprogramming proxies