CGLib动态代理使用与原理

CGLib是一种在Java中实现动态代理的方式,它通过生成目标类的子类来实现代理,重写非final方法,并使用方法拦截插入横切逻辑。相较于JDK动态代理,CGLib在性能上更优,尤其适用于未实现接口的类。CGLib主要由ASM字节码处理框架支持,广泛应用于Spring AOP和Hibernate等。在使用CGLib时,需要创建被代理类、实现MethodInterceptor并使用Enhancer生成动态代理。CGLib的一个主要缺点是不能代理final方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

Java中代理有静态代理、动态代理,动态代理中又分JDK动态代理和CGLib动态代理

本文讲一下CGLib动态代理的使用和源码实现,

CGLib动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截,拦截所有父类方法的调用,顺势织入横切逻辑。比使用java反射的JDK动态代理要快

基于jdk1.8.0_161,spring-core5.2.8RELEASE

附上其他两种代理的博文
Java静态代理

JDK动态代理原理 源码详解

CGLib简介

一、什么是CGLIB?

CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。

二、CGLIB原理

CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。

CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。

CGLIB缺点:对于final方法,无法进行代理。

三、CGLIB的应用

广泛的被许多AOP的框架使用,例如Spring
AOP和dynaop。Hibernate使用CGLIB来代理单端single-ended(多对一和一对一)关联。

使用

步骤

1.新建被代理类

2.新建MethodInterceptor接口的实现类,Override intercept方法

3.使用Enhancer生成动态代理

代码

为了方便,上述步骤的接口、类都写到一个类下面

package com.jaylin.jaylin.proxy;

import java.lang.reflect.Method;
import org.springframework.cglib.core.DebuggingClassWriter;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

public class CglibProxyTest {
    //被代理类
    static class TestClass {
        public void testMethod() {
            System.out.println("testMethod execute");
        }
    }

    static class MyInterceptor implements MethodInterceptor {
        //使用Enhancer生成动态代理
        public static void main(String[] args) {
            //设置代理类生成目录,方便查看
            System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\proxy");
            //Enhancer用于生成动态子类以启用方法拦截
            Enhancer enhancer = new Enhancer();
            //设置父类,Cglib基于父类生成代理子类
            enhancer.setSuperclass(TestClass.class);
            //设置回调、拦截处理
            enhancer.setCallback(new MyInterceptor());
            //创建代理类
            TestClass proxyClass = (TestClass) enhancer.create();
            //调用代理类的方法
            proxyClass.testMethod();
        }

        @Override
        public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            Object result = methodProxy.invokeSuper(obj, objects);
            return result;
        }
    }
}

源码解读

Spring | Aop核心 | Cglib源码详细解析 讲得很好,我不想讲了

参考:

java中的三种代理模式

Spring | Aop核心 | Cglib源码详细解析

CGLIB介绍与原理

CGLIB(Code Generation Library)详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值