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 版本中得到修复。感谢您的报告。
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 版本中得到修复。感谢您的报告。