JDK 和 Cglib 动态代理的实现和区别

2,200 阅读1分钟

1、JDK动态代理实现

    说明:

ProxyProxy是所有动态代理的父类,它提供了一个静态方法来创建动态代理的class对象和实例;
InvocationHandler:每个动态代理实例都有一个关联的InvocationHandler。 
在代理实例上调用方法时,方法调用将被转发到InvocationHandler的invoke方法;

    因为JDK动态代理是基于接口的,先创建一个接口

目标类:

增强类:

代理类:

测试测试类:

结果:

2、Cglib 动态代理实现

   说明:

1CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承方式实现代理;
2、Enhancer:来指定要代理的目标对象、实际处理代理逻辑的对象,最终通过调用create()方法得到代理对象,对这个对象所有非final方法的调用都会转发给MethodInterceptor;
3、MethodInterceptor:动态代理对象的方法调用都会转发到intercept方法进行增强;

目标类:

增强类:

代理类:

测试类:

结果:

JDK动态代理和Cglib动态代理特点和区别:

 1、JDK原生动态代理是java原生支持的,不需要任何外部依赖,但它只能基于接口进行代理;

2、Cglib通过继承的方式进行代理,无论目标对象有没有实现接口都可以进行代理,但是无法处理fianl的情况;