我有一个有点奇怪的接口,可以使用ByteBuddy来实现。假设它看起来像这样:
public interface Foo<T> {
public T getBar();
public void setBarSupplier(final BarSupplier supplier);
}
从DynamicType.Builder
中实现此接口的最惯用的方法是什么?假设我已经定义了private
类型的BarSupplier
字段,并且:
setBarSupplier(BarSupplier)
来设置此字段,然后getBar()
才能对存储在此字段中的get()
调用某种方法(假设它是BarSupplier
)并返回其结果我知道intercept(Implementation)
方法,该方法需要(如您所见)单个Implementation
。对于getter / setter对,这很好用,因为您可以传入FieldAccessor
,并且FieldAccessor
将生成two方法:getter和setter。 (这不适用于我的情况:我需要两个截然不同的方法实现。)
[我也知道使用defineMethod()
手动定义方法,如果这是正确的方法,我准备这样做。
但是,我不确定以这种方式定义的方法是否会与定义它们的接口缺乏某种必要的关联(implement
返回具有单个intercept
方法的对象这一事实使我认为这是正确实现接口的唯一方法)。如果我不使用链接到Foo<T>
方法的intercept
并手动定义方法,我的动态类是否仍将实现implement
? (与所有DSL一样,我在这里的道路上面临着叉子,没有地图:我选择implement
还是选择defineMethod
?我怎么知道?)
[您可以使用defineMethod
,Byte Buddy将检测替代,但是实现该接口可能更容易,然后使用.method(...)
匹配器,例如按名称。如果您想避免任何歧义,甚至可以匹配.method(Foo.class.getMethod(...))
。