专业的编程技术博客社区

网站首页 > 博客文章 正文

java设计模式cglib动态代理

baijin 2025-01-07 10:42:46 博客文章 9 ℃ 0 评论

cglib动态代理:静态代理和jdk动态代理都是要求目标对象实现接口。但有时候目标对象是单独的对象,并没有实现任何接口,这个时候就可以使用目标对象子类的方式实现代理。

Cglib:(Code Generation Library)也叫子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展。是基于asm框架,实现了无反射机制进行代理,利用空间换取时间,代理效率高于jdk动态代理。

Cglib:是一个强大高性能代码生成包,它可以在运行期间扩展java类及实现接口。被许多AOP框架使用,如Spring AOP和synaop提供方法的interception拦截。

Cglib子类动态代理实现方法:(1) 引入cglib的jar包,但是spring核心包中已包含了cglib功能,所以直接引入spring-core.5.3.13.jar即可 (2) 引入功能后,就可以在内存中动态构建子类 (3) 代理的类不能为final否则报错 (4) 目标对象的方法如果为final/static那么就不会被拦截。

Cglib核心类:(1)Enhancer主要的增强类,是Cglib常用类和Proxy差不多,不同的是Enhancer既然代理普通的class也能够代理接口,创建被代理类的子类并且拦截所有方法调用(包括从Object继承的toString和hashcode方法)不能够拦截final方法和操作final类。(2)MethodInterceptor 主要的方法拦截类,需要用户实现,是通用的回调(callback)类型,它经常被AOP用来实现拦截(intercept)方法调用,这个接口只定义了一个方法。public Object intercept(Object proxy, Method method, Object[] params, MethodProxy methodProxy)参数:proxy被代理对象 method 执行的方法 params 方法中的参数,methodProxy代理的方法。

/**
 * @date: 2022/6/4 20:38
 * @desc: 被代理对象
 */
public class Say {
    public void say() {
        System.out.println("目标方法输出的内容");
    }
}
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
 * @date: 2022/6/5 08:53
 * @desc: cglib动态代理
 */
public class ProxyFactory implements MethodInterceptor {
    private Object targetObj;
    public ProxyFactory(Object targetObj_){
        targetObj = targetObj_;
    }
    public Object createInstance() {
        // 增强类,设置父类,设置回调
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targetObj.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }
    public Object intercept(Object o, Method method, Object[] params, MethodProxy methodProxy) throws Throwable {
        System.out.println("日志开始");
        Object obj = methodProxy.invoke(targetObj, params);
        System.out.println("日志结束");
        return obj;
    }
}
        // 测试代码
        Say say = (Say) new ProxyFactory(new Say()).createInstance();
        say.say();
maven依赖
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.13</version>
        </dependency>

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表