Search code examples
javaspringjakarta-eecglib

CGLib proxy and none empty constructor


Let's consider that I have some Class A which has property of class B.

public class ClassA{

private ClassB classB; 

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

 //some methods ommitted.
}

No I have CGLIB proxy:

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

Now, When I use CGLib for ClassA , proxy creates ClassA instance.

My question is how can I pass classB parameter to this proxy, because as far As I understand CGLib will run empty constructor for ClassA?


Solution

  • I do not see any code examples on how you are wrapping ClassA in with the CGLibProxy class but if you are dealing with cglib directly then you should have a instance of net.sf.cglib.proxy.Enhancer in that case you can supply the constructor args as follows.

    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());
        }
    }