如何使用cglib生成自定义字段的代理?

时间:2016-10-31 08:19:40

标签: java dynamic proxy cglib

我使用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);
        }
    });

当然,另一种方法是使用地图将值绑定到原始对象,但我并不喜欢这样做。

有没有人有任何想法?

1 个答案:

答案 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,您可以使用回调类添加回调以委托给每个代理的特定增强器实例。