来自派生类

时间:2016-06-11 17:11:19

标签: java dynamic reflection metaprogramming proxies

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

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 个答案:

答案 0 :(得分:0)

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