0

クラスBのプロパティを持つクラスAがあると考えてみましょう。

public class ClassA{

private ClassB classB; 

public ClassA(ClassB classB){
 this.classB = classB;
}

 //some methods ommitted.
}

いいえ、CGLIB プロキシがあります。

public class CGLibProxy  implements MethodInterceptor{

    @Override
    public Object intercept(Object object, Method method, Object[] args,
            MethodProxy methodProxy) throws Throwable {

    if (method.getName().startsWith("print")){
        System.out.println("We will not run any method started with print"); 
        return null;
    }
        else
        return methodProxy.invokeSuper(object, args);
    }
}

さて、CGLibClassA に使用すると、プロキシは ClassA インスタンスを作成します。

私の質問は、classB パラメーターをこのプロキシに渡す方法です。私が理解している限り、CGLib は ClassA の空のコンストラクターを実行しますか?

4

1 に答える 1

7

ClassAクラスでどのようにラップするかについてのコード例はCGLibProxy見当たりませんが、cglib を直接扱っている場合はnet.sf.cglib.proxy.Enhancer、次のようにコンストラクター引数を指定できるインスタンスが必要です。

import net.sf.cglib.proxy.Enhancer;

public class CGLibProxyMain {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(ClassA.class);
        enhancer.setCallback(new CGLibProxy());
        ClassA a = (ClassA) enhancer.create(new Class[] {ClassB.class}, new Object[] {new ClassB()});
        System.out.println(a.printB());;
        System.out.println(a.otherMethod());
    }
}
于 2012-10-15T05:21:27.987 に答える