CGLib代理和无空构造函数

dan*_*nik 0 java spring java-ee cglib

让我们考虑一下我有一些具有B类属性的A类.

public class ClassA{

private ClassB classB; 

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

 //some methods ommitted.
}
Run Code Online (Sandbox Code Playgroud)

不,我有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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我CGLib用于ClassA时,代理会创建ClassA实例.

我的问题是如何将classB参数传递给此代理,因为据我所知,CGLib将为ClassA运行空构造函数?

Pat*_*ick 6

我没有看到关于如何ClassA使用CGLibProxy类包装的任何代码示例,但如果您直接处理cglib,那么您应该有一个实例,net.sf.cglib.proxy.Enhancer在这种情况下,您可以提供构造函数args,如下所示.

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());
    }
}
Run Code Online (Sandbox Code Playgroud)