使用 ByteBuddy 访问检测方法参数的字段

Accessing fields on parameters of instrumented method using ByteBuddy

我正在尝试在运行时生成高效的 属性 访问器。具体来说,这意味着我正在生成使用 ByteBuddy 实现以下接口的 classes:

interface PropertyAccess<T> {
    void set(Object instance, T value);
    T get(Object instance);
}

实施应如下所示:

class SomeProperty implements PropertyAccess<String> {
    public void set(Object o, String s) {
        ((SomeClass) o).setFoo(s);
    }
    public String get(Object o) {
        return ((SomeClass) o).getFoo();
    }
 }

为 getter/setter 对执行此操作很容易(gettersetter 是实际 getter 和 [=39= 的 java.lang.reflect.Method 对象]):

new ByteBuddy()
    .subclass(Object.class)
    .implement(PropertyAccess<String>.class) // pseudo syntax, I am using Guava's TypeToken here in reality
    .method(named("get")).intercept(invoke(getter).onArgument(0))
    .method(named("set")).intercept(invoke(setter).onArgument(0).withArgument(1))

(我在这里省略了允许从 Object 转换为 SomeClass 的分配器类型)。

但现在我还想允许为直接访问的字段生成这样的 class,我无法在不编写自定义 Implementation class 的情况下找到这样做的方法,因为FieldAccessor 仅允许访问生成的 class(或其父项之一)的字段

我是不是漏掉了什么?

你是对的,目前没有办法访问字段而不是方法。然而,我认为这应该很容易通过处理类似于 getter 或 setter 的字段访问来解决。我在 ticket #225.

中跟踪此限制