CGLib底层原理

126 阅读1分钟

cglib

动态代理,cglib 方式实现(区别于JDK的动态代理)

asm 技术,为一个类创建子类

以一个具体的使用场景开始,CGLib 实现动态代理。

一个普通的 class

public class PayHandler {

   public String pay(String odn){

       return odn + " 支付完成";
   }
}

CGlib 来代理这个类

public class PayProxy implements MethodInterceptor {

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

        System.out.println("cglib 代理 - before");
        Object oj =methodProxy.invokeSuper(o,objects);
        System.out.println("cglib 代理 - after,已发出短信 ... ... ");
        return oj;
    }
}

访问PayHandler,其实只需要访问代理类即可

main(){
        
    Properties p = new Properties();
    p.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"D:\class");
    System.setProperties(p);  // cglib 生成的class 文件 放到磁盘中
    String odn="19-04-2022";

    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(PayHandler.class);
    enhancer.setCallback(new PayProxy());

    PayHandler ph = (PayHandler)enhancer.create();
    String pr = ph.pay(odn);

    System.out.println(pr);

}

至此,看到cglib 很神奇,带着好奇心走下去,解开 cglib的什么面纱 。