cglib动态代理

Posted wlwl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cglib动态代理相关的知识,希望对你有一定的参考价值。

cglib实现原理:生成被代理对象的子类,使用ASM字节码技术重组来重写父类(被代理对象)的方法。生成的这个新对象,可以强制转换为被代理对象。也就是子类引用赋值给父类!

案例编写:

1. 导入cglib依赖包

  <dependencies>
    <!-- https://mvnrepository.com/artifact/cglib/cglib -->
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>2.2.2</version>
    </dependency>
  </dependencies>

2. 实现cglib动态代理类

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class MyCglibProxy implements MethodInterceptor{
    
    /**
     * @param clazz   被代理的类
     */
    public Object getInstance(Class clazz) throws Exception{
        //1. 创建字节码增强器,用来对被代理的类扩展。
        Enhancer enhancer = new Enhancer();
        //2. 告诉cglib,生成的子类需要继承那个父类。
        enhancer.setSuperclass(clazz);
        //3. 设置回调
        enhancer.setCallback(this);
        //4. 生成源代码,编译成class文件,加载到jvm,并返回代理对象。
         Object obj = enhancer.create();
         return obj;
    }
    /**
     * @param obj    生成的子类  
     * @param method 被拦截的方法
     * @param args   被拦截方法的参数
     * @param proxy  触发父类的方法对象
     */
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("正在进行挑选 ... ");
        proxy.invokeSuper(obj, args);
        System.out.println("包裹已发出,正在派送中!");
        return null;
    }
}

3. 创建被代理类

public class Clothes {
    public void buyClothes() {
        System.out.println("我要买衣服");
    }
}


public class Computer {
    public void buyComputer() {
        System.out.println("我要买电脑");
    }
}

4. 测试

public class Test {

    public static void main(String[] args) {
        try {
            Clothes obj = (Clothes)new MyCglibProxy().getInstance(Clothes.class);
            obj.buyClothes();
            System.out.println("====================");
            Computer obj2 = (Computer)new MyCglibProxy().getInstance(Computer.class);
            obj2.buyComputer();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

==================
【控制台输出】
        正在进行挑选 ... 
        我要买衣服
        包裹已发出,正在派送中!
        ====================
        正在进行挑选 ... 
        我要买电脑
        包裹已发出,正在派送中!
           

以上是关于cglib动态代理的主要内容,如果未能解决你的问题,请参考以下文章

Spring中的cglib动态代理

JDK动态代理CGLIB动态代理

JDK动态代理CGLIB动态代理

动态代理之 CGLIB 动态代理

代理模式(静态代理jdk动态代理CGLib动态代理)

AOP动态代理之CGLIB代理