使用 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 对执行此操作很容易(getter
和 setter
是实际 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.
中跟踪此限制
我正在尝试在运行时生成高效的 属性 访问器。具体来说,这意味着我正在生成使用 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 对执行此操作很容易(getter
和 setter
是实际 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.
中跟踪此限制