在 ByteBuddy 中实现非 getter-setter 接口的两种方法最惯用的方法是什么?

What is the most idiomatic way to implement a two-method, non-getter-setter interface in ByteBuddy?

我有一个使用 ByteBuddy 来实现的有点奇怪的界面。假设它看起来像这样:

public interface Foo<T> {
  public T getBar();
  public void setBarSupplier(final BarSupplier supplier);
}

DynamicType.Builder 中实现此接口的最惯用的方法是什么?假设我已经定义了一个类型为 BarSupplierprivate 字段,并且:

  1. 我需要实施 setBarSupplier(BarSupplier) 来设置这个字段并且
  2. 我需要 getBar() 的实现来调用存储在该字段中的 BarSupplier 上的某些方法(假设它是 get())和 return 其结果

我知道 intercept(Implementation) 方法,它采用(如您所见)单个 Implementation。对于 getter/setter 对,这很有效,因为你可以传入一个 FieldAccessor 并且 FieldAccessor 将生成 两个 方法: getter 和 setter。 (这不适用于我的情况:我需要两种截然不同的方法实现。)

我也知道使用 defineMethod() 简单地手动定义方法,如果这是正确的做事方式,我准备这样做。

但是,我不确定以这种方式定义的方法是否会缺少与定义它们的接口的某种必要关联(事实上 implement returns 是一个具有单个对象的对象intercept 方法让我认为这是正确实现接口的唯一方法)。如果我不使用链接到 implement 方法的 intercept 而只是手动定义我的方法,我的动态 class 是否仍会实现 Foo<T>? (与所有 DSL 一样,我在这里遇到了岔路口,而且没有地图:我是选择 implement 还是选择 defineMethod?我怎么知道?)

您可以使用 defineMethod,Byte Buddy 会检测到覆盖,但实现接口然后使用 .method(...) 匹配器(例如按名称)可能更容易。如果您想避免任何歧义,您甚至可以匹配 .method(Foo.class.getMethod(...))