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

==================
【控制台输出】
        正在进行挑选 ... 
        我要买衣服
        包裹已发出,正在派送中!
        ====================
        正在进行挑选 ... 
        我要买电脑
        包裹已发出,正在派送中!
           
复制代码
posted @   吴磊的  阅读(1453)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
//生成目录索引列表
点击右上角即可分享
微信分享提示