上ByteBuddy的documentation用于使用Pipe
注解与方法委托指出java.util.function.Function
要绑定为使用Pipe
合适的类型。ByteBuddy Pipe.Binder失败用java 8功能
的@Pipe注释不与MethodDelegation 预先注册,因为Java类库没有附带的Java 8前用合适的接口 类型定义了功能类型。
但是,当我真正使用它(在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
上的任何方法。
你能编译java 8代码吗?用'Function f = s - > s来说一个主体?'? –
assylias
@assylias是的。代码编译得很好。问题不在于函数无法找到。 ByteBuddy似乎并不喜欢在Function接口中声明的方法,尽管文档指出了它可以使用。 –