CGLIB的实现原理

欣喜 Java教程 发布时间:2025-03-24 09:48:27 阅读数:8720 1
下文笔者讲述CGLIB的简介说明,如下所示

CGLIB简介

 
CGLIB(Code Generation Library)是一个强大代码生成库
   主要用于在运行时动态生成代理类
在我们日常的AOP面向切面编程时,经常使用此方式
 如:Spring AOP,Spring事务

CGLIB的基本概念

 
CGLIB基本概念
1.动态代理:
  -动态代理是指在运行时动态生成代理类,
    而不是在编译时生成

2.字节码操作:
  -CGLIB使用字节码操作库(如 ASM)来生成代理类

3.继承机制:
  -CGLIB通过生成目标类的子类来实现代理,
    因此目标类不能是`final`

CGLIB实现原理

1.生成代理类
   CGLIB通过生成目标类的子类来实现代理。
    生成的代理类会重写目标类的方法,
	并在这些方法中添加额外的逻辑(如拦截器)

2.使用ASM 进行字节码操作
   CGLIB使用ASM库来生成和操作字节码
    ASM是一个高效的字节码操作库
	 可以生成新的类或修改现有类

3.拦截器(MethodInterceptor)
   CGLIB使用`MethodInterceptor`接口来拦截方法调用
     当代理类的方法被调用时
	  会先调用拦截器的方法
	   然后在拦截器中决定是否调用目标类的方法

4.代理类的创建
   CGLIB生成代理类会继承目标类
    并重写目标类的方法
	代理类的方法会调用拦截器方法
	 拦截器再决定是否调用目标类方法

详细步骤
  1.生成代理类:
   - CGLIB 通过继承目标类生成一个新的子类。
   - 生成的子类会重写目标类的方法。

  2.拦截器:
   - 定义一个 `MethodInterceptor` 接口的实现类。
   - 在拦截器中实现方法调用的拦截逻辑。

  3.代理类实例化:
   - 使用 `Enhancer` 类来创建代理类的实例。
   - 设置目标类和拦截器。

 
1.添加CGLIB依赖
    使用 Maven,可以在 `pom.xml` 中添加以下依赖:
 
	<dependency>
		<groupId>cglib</groupId>
		<artifactId>cglib</artifactId>
		<version>3.3.0</version>
	</dependency>
 
 使用 Gradle
   可在`build.gradle`中
    添加以下依赖:
	dependencies {
		implementation 'cglib:cglib:3.3.0'
	}

2.定义目标类
public class TargetClass {
    public void sayHello() {
        System.out.println("Hello from TargetClass!");
    }
} 

3.定义拦截器
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class MyMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before method: " + method.getName());
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("After method: " + method.getName());
        return result;
    }
}

4.创建代理类并使用
import net.sf.cglib.proxy.Enhancer;

public class CglibExample {
    public static void main(String[] args) {
        // 创建 Enhancer 对象
        Enhancer enhancer = new Enhancer();
        // 设置目标类
        enhancer.setSuperclass(TargetClass.class);
        // 设置拦截器
        enhancer.setCallback(new MyMethodInterceptor());

        // 创建代理类的实例
        TargetClass proxyInstance = (TargetClass) enhancer.create();

        // 调用代理类的方法
        proxyInstance.sayHello();
    }
}


===代码详解

1.定义目标类:
    public class TargetClass {
        public void sayHello() {
            System.out.println("Hello from TargetClass!");
        }
    }
    - `TargetClass`:目标类
	   包含要代理的方法 `sayHello`

2.定义拦截器:
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;

    import java.lang.reflect.Method;

    public class MyMethodInterceptor implements MethodInterceptor {
        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println("Before method: " + method.getName());
            Object result = proxy.invokeSuper(obj, args);
            System.out.println("After method: " + method.getName());
            return result;
        }
    }
    - `MyMethodInterceptor`:实现 `MethodInterceptor` 接口。
    - `intercept` 方法:在目标方法调用前后添加额外的逻辑。

3.创建代理类并使用:
    import net.sf.cglib.proxy.Enhancer;

    public class CglibExample {
        public static void main(String[] args) {
            // 创建 Enhancer 对象
            Enhancer enhancer = new Enhancer();
            // 设置目标类
            enhancer.setSuperclass(TargetClass.class);
            // 设置拦截器
            enhancer.setCallback(new MyMethodInterceptor());

            // 创建代理类的实例
            TargetClass proxyInstance = (TargetClass) enhancer.create();

            // 调用代理类的方法
            proxyInstance.sayHello();
        }
    }
    -创建 `Enhancer`对象:
	     `Enhancer` 是 CGLIB 的核心类,
		  用于生成代理类。
    -设置目标类:
	      `enhancer.setSuperclass(TargetClass.class)` 
		    设置要代理的目标类。
    -设置拦截器:
	      `enhancer.setCallback(new MyMethodInterceptor())` 
		    设置拦截器。
    -创建代理类的实例:
	      `enhancer.create()` 
		    创建代理类的实例。
    -调用代理类的方法:
	      `proxyInstance.sayHello()` 
		    调用代理类的方法,
			  拦截器会在方法调用前后添加额外的逻辑。

===运行以上代码,将输出以下信息======
 
Before method: sayHello
Hello from TargetClass!
After method: sayHello

CGLIB 相关知识总结

1.生成代理类:
   - CGLIB 通过继承目标类生成一个新的子类。
   - 生成的子类会重写目标类的方法。

2.拦截器:
   - 定义一个 `MethodInterceptor` 接口的实现类。
   - 在拦截器中实现方法调用的拦截逻辑。

3.代理类的实例化:
   - 使用 `Enhancer` 类来创建代理类的实例。
   - 设置目标类和拦截器。

4.方法调用:
   - 当代理类的方法被调用时,会先调用拦截器的方法。
   - 拦截器再决定是否调用目标类的方法
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202503/8393.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者