2016-02-03 36 views
0

上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上的任何方法。

+0

你能编译java 8代码吗?用'Function f = s - > s来说一个主体?'? – assylias

+0

@assylias是的。代码编译得很好。问题不在于函数无法找到。 ByteBuddy似乎并不喜欢在Function接口中声明的方法,尽管文档指出了它可以使用。 –

回答

0

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

+0

我是否应该将此记录为github问题? –

+0

你可能有,因为这是一个比一般问题更多的错误报告,但只要我注意到这个问题,对我来说并不重要。 –