ByteBuddy Pipe.Binder 失败,java 8 函数

ByteBuddy Pipe.Binder fails with java 8 Function

ByteBuddy 上关于使用带有方法委托的 Pipe 注释的 documentation 指出 java.util.function.Function 是一种适合与 Pipe 一起使用的类型。

The @Pipe annotation is not preregistered with the MethodDelegation because the Java class library does not come with a suitable interface type before Java 8 which defines the Function type.

然而,当我实际使用它时(在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.1.1 版本中得到修复。感谢您的报告。