В 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
, также должны быть исключены при попытке идентифицировать единственный метод для сквозного прохождения.
Можете ли вы скомпилировать код java 8? Скажем main с помощью функции f = s -> s; '? –
assylias
@assylias Да. Код компилируется просто отлично. Проблема заключается не в том, что функция не может быть найдена. Дело в том, что ByteBuddy на самом деле не похоже на методы, объявленные на интерфейсе Function, несмотря на документацию, указывающую, что он может быть использован. –