ByteBuddy Pipe.Binder失败了java 8函数

时间:2016-02-03 13:36:45

标签: java bytecode byte-buddy

ByteBuddy上的documentation使用带有方法委派的Pipe注释表明java.util.function.Function是绑定用于Pipe的合适类型。

  

@Pipe注释未预先注册MethodDelegation   因为Java类库没有合适的接口   在Java 8之前键入,它定义了Function类型。

然而,当我实际使用它时(在java 8中),抛出异常,这似乎是由Function上的默认方法引起的。

java.lang.IllegalArgumentException: interface java.util.function.Function must declare exactly one non-static method
    at net.bytebuddy.implementation.bind.annotation.Pipe$Binder.onlyMethod(Pipe.java:164)
    at net.bytebuddy.implementation.bind.annotation.Pipe$Binder.install(Pipe.java:145)
    at net.bytebuddy.implementation.bind.annotation.Pipe$Binder.install(Pipe.java:131)

这是绑定代码:

builder.implement(Proxy.class)
       .method(ElementMatchers.any())
       .intercept(MethodDelegation.to(ProxyClassImpl.class)
                                  .appendParameterBinder(Pipe.Binder.install(Function.class)));

问题似乎是Pipe.Binder.install正在寻找所有非静态方法。也许它也应该排除默认方法。

此外,我使用com.google.common.base.Function尝试此操作并遇到类似的失败,因为它声明equals方法已从Object覆盖。因此,在尝试识别要通过的单个方法时,也可能排除Object上存在的任何方法。

1 个答案:

答案 0 :(得分:0)

您在我最近的版本中引入了库中的错误。这不应该发生,它将在我今天发布的1.1.1版本中修复。感谢您的举报。