Почему ByteBuddy говорит мне, что в моих методах перехватчиков есть неоднозначность, когда существует только один такой метод? - PullRequest
1 голос
/ 14 апреля 2020

(Пытаясь сохранить простоту.)

У меня есть (частичный) рецепт ByteBuddy, подобный этому:

builder
  .method(someMatcher())
  .intercept(MethodDelegation.to(this.interceptor));

У меня есть класс "перехватчика", определенный следующим образом:

private static final class Interceptor {

  private Interceptor() {
    super();
  }

  @RuntimeType
  private final Object doSomething(@This final Proxy<?> proxy,
                                   @SuperCall final Callable<?> callable,
                                   @Origin final String methodSignature) throws Exception {
    final Object proxiedInstance = proxy.getProxiedInstance();
    // TODO: logic
    return callable.call(); // for now
  }

}

(Метод перехватчика должен быть не-static по разным причинам, здесь не важно.)

Когда я создаю экземпляр этого класса, определенного ByteBuddy, и вызываю простой public void blork() метод на это, я получаю:

Cannot resolve ambiguous delegation of public void com.foo.TestExplorations$Frob.blork() to net.bytebuddy.implementation.bind.MethodDelegationBinder$MethodBinding$Builder$Build@3d101b05 or net.bytebuddy.implementation.bind.MethodDelegationBinder$MethodBinding$Builder$Build@1a9efd25

Как может быть двусмысленность, когда есть только один перехватчик? Что я сделал не так?

1 Ответ

0 голосов
/ 16 апреля 2020

Byte Buddy просто добавляет вызов метода в инструментированный класс, который должен иметь возможность видеть целевой класс. Если это private, он игнорируется, и Байт Бадди ищет в иерархии дальнейший путь, где он, наконец, рассматривает методы Object, которые в равной степени не подходят, но поэтому выдается исключение неоднозначности вместо исключения, что ни один метод не может быть связан .

...