【问题标题】:Java reflection call default method from derived class派生类的Java反射调用默认方法
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2012-05-31
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多