如何将字段添加到 ByteBuddy 中的 class 并在方法拦截器中设置/获取该值
How to add a field to a class in ByteBuddy and set / get that value in a method interceptor
我正在使用 byte-buddy 在 Ignite 之上构建一个 ORM,我们需要向 class 添加一个字段,然后在方法拦截器中访问它。
下面是一个示例,我将一个字段添加到 class
final ByteBuddy buddy = new ByteBuddy();
final Class<? extends TestDataEnh> clz = buddy.subclass(TestDataEnh.class)
.defineField("stringVal",String.class)
.method(named("setFieldVal")).intercept(
MethodDelegation.to(new SetterInterceptor())
)
.make()
.load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
final TestDataEnh enh = clz.newInstance();
enh.getFieldVal();
enh.setFieldVal();
System.out.println(enh.getClass().getName());
拦截器是这样的
public class SetterInterceptor {
@RuntimeType
public Object intercept() {
System.out.println("Invoked method with: ");
return null;
}
}
那么如何将新字段的值放入拦截器中以便更改它的值? (字符串值)
提前致谢
您可以使用 FieldProxy
通过名称访问字段。您需要先安装 FieldProxy.Binder
并在 MethodDdelegation
上注册它,然后才能使用它,因为它需要自定义类型以进行类型安全检测。 javadoc 解释了如何做到这一点。或者,您可以使用 @This
在实例上使用反射。 JVM在优化反射的使用上相当高效。
例如:
interface FieldGetter {
Object getValue();
}
interface FieldSetter {
void setValue(Object value);
}
public class SetterInterceptor {
@RuntimeType
public Object intercept(@FieldProxy("stringVal") FieldGetter accessor) {
Object value = accessor.getValue();
System.out.println("Invoked method with: " + value);
return value;
}
}
对于bean属性,FieldProxy
注解不需要明确的名字,而是从截获的getter或setter.
的名字中发现名字
安装方式如下:
MethodDelegation.to(SetterInterceptor.class)
.appendParameterBinder(FieldProxy.Binder.install(FieldGetter.class,
FieldSetter.class));
我正在使用 byte-buddy 在 Ignite 之上构建一个 ORM,我们需要向 class 添加一个字段,然后在方法拦截器中访问它。
下面是一个示例,我将一个字段添加到 class
final ByteBuddy buddy = new ByteBuddy();
final Class<? extends TestDataEnh> clz = buddy.subclass(TestDataEnh.class)
.defineField("stringVal",String.class)
.method(named("setFieldVal")).intercept(
MethodDelegation.to(new SetterInterceptor())
)
.make()
.load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
final TestDataEnh enh = clz.newInstance();
enh.getFieldVal();
enh.setFieldVal();
System.out.println(enh.getClass().getName());
拦截器是这样的
public class SetterInterceptor {
@RuntimeType
public Object intercept() {
System.out.println("Invoked method with: ");
return null;
}
}
那么如何将新字段的值放入拦截器中以便更改它的值? (字符串值)
提前致谢
您可以使用 FieldProxy
通过名称访问字段。您需要先安装 FieldProxy.Binder
并在 MethodDdelegation
上注册它,然后才能使用它,因为它需要自定义类型以进行类型安全检测。 javadoc 解释了如何做到这一点。或者,您可以使用 @This
在实例上使用反射。 JVM在优化反射的使用上相当高效。
例如:
interface FieldGetter {
Object getValue();
}
interface FieldSetter {
void setValue(Object value);
}
public class SetterInterceptor {
@RuntimeType
public Object intercept(@FieldProxy("stringVal") FieldGetter accessor) {
Object value = accessor.getValue();
System.out.println("Invoked method with: " + value);
return value;
}
}
对于bean属性,FieldProxy
注解不需要明确的名字,而是从截获的getter或setter.
安装方式如下:
MethodDelegation.to(SetterInterceptor.class)
.appendParameterBinder(FieldProxy.Binder.install(FieldGetter.class,
FieldSetter.class));