2016-02-03 2 views
0

В documentation на ByteBuddy для использования 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? Скажем main с помощью функции f = s -> s; '? – assylias

+0

@assylias Да. Код компилируется просто отлично. Проблема заключается не в том, что функция не может быть найдена. Дело в том, что ByteBuddy на самом деле не похоже на методы, объявленные на интерфейсе Function, несмотря на документацию, указывающую, что он может быть использован. –

ответ

0

Вы нашли ошибку в библиотеке, которую я представил в недавней версии. Это не должно произойти, и оно будет исправлено в версии 1.1.1, которую я выпущу сегодня. Спасибо, что сообщили.

+0

Должен ли я зарегистрировать это как проблему github? –

+0

Вы могли бы иметь, так как это скорее отчет об ошибке, чем общий вопрос, но для меня это не имеет большого значения, пока я замечаю вопрос. –

Смежные вопросы