我使用cglib生成某个类的代理对象,我需要将一些custome字段绑定到代理对象,如下所示
String customFieldName = "myCustomField";
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetClass);
// What can I do to add custom field to the proxy class ?
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// I'd access the custom field value here
Field field = obj.getClass().getField(customFieldName);
Object customFieldValue = field.get(obj);
// do something
return proxy.invokeSuper(obj, args);
}
});
当然,另一种方法是使用地图将值绑定到原始对象,但我并不喜欢这样做。
有没有人有任何想法?
答案 0 :(得分:0)
使用cglib时,这是不可能的,除非您愿意访问底层ASM API以直接在字节代码中添加字段,否则它没有API。如果您愿意更改工具,可以使用Byte Buddy,我维护的库:
Class<? extends TargetClass> proxy = new ByteBuddy()
.subclass(targetClass)
.method(any())
.intercept(MethodDelegation.to(MyInterceptor.class)
.andThen(SuperMethodCall.INSTANCE)
.defineField("myCustomField", Object.class, Visibility.PUBLIC)
.make()
.load(targetClass.getClassLoader())
.getLoaded();
class MyInterceptor {
static void intercept(@FieldValue("myCustomField") Object myCustomField) {
// do something
}
}
使用cglib,您可以使用回调类添加回调以委托给每个代理的特定增强器实例。