2016-10-31 10 views
0

私はいくつかのクラスのプロキシオブジェクトを生成するCGLIBを使用している、と私は代替に値をバインドするマップを使用しているもちろんcglibを使用してカスタムフィールドでプロキシを生成するには?

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

これは、cglibを使用する場合は不可能です。基本的なASM APIにアクセスしてバイトコードで直接フィールドを追加する場合を除き、APIはありません。あなたがツールを変更するために喜んでいる場合、あなたはしかしByte Buddy、私は維持するライブラリを使用することができます:CGLIBで

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 
    } 
} 

を、あなたは、代わりにコールバックを使用することにより、個々のプロキシの特異的エンハンサーインスタンスに委任するコールバックを追加することができますクラス。

関連する問題