栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA代理模式-cglib动态代理的实现(三)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA代理模式-cglib动态代理的实现(三)

JAVA代理模式-cglib动态代理的实现(三)
    • CGLIB动态代理:
      • 导包
        • 1.使用了Maven管理项目则引入一下坐标即可。
        • 2.未使用maven,则可以通过如下方式导包。
      • 在完成环境配置之后,进行CGLIB动态代理的实现:
        • 1.编写实体类。
        • 2.通过cglib动态生成代理类,动态生成的代理类为实体类的子类。
        • 3. 客户端从中介买票
    • CGLIB实现动态代理的完整代码:

代理模式简介、静态代理、JDK动态代理可以参考以下文章:
JAVA代理模式-静态代理的实现(一)
JAVA代理模式-JDK动态代理的实现(二)

CGLIB动态代理:

考虑以下场景,你需要去中介手里买电影票,中介会在售票的基础上增强手续费。
则电影院为真实主题类,而中介则为代理类,在真实主题类售卖电影票的基础上,增强功能收取了一定的手续费。

在之前JAVA代理模式-静态代理的实现(一)和 JAVA代理模式-JDK动态代理的实现(二)中,实现代理模式时,首先需要定义一个接口,然后定义实现该接口的实现类,以及获得实现该接口的代理类。

但是如果没有定义接口,只定义了实体类。很显然JDK代理是无法使用了,因为JDK动态代理要求必须定义接口,对接口进行代理。

CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。但是使用CGLIB需要自行进行导包。

导包 1.使用了Maven管理项目则引入一下坐标即可。

cglib
cglib
2.2.2

2.未使用maven,则可以通过如下方式导包。

参考链接:在文章的后半部分,有下载和导入的方式

在完成环境配置之后,进行CGLIB动态代理的实现: 1.编写实体类。
class NbCinema{
    public void sell(){
        System.out.println("售卖火车票!");
    }
}
2.通过cglib动态生成代理类,动态生成的代理类为实体类的子类。
class GclibProxyFactory implements MethodInterceptor{

    public NbCinema getProxyObject(){
        // 创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数
        Enhancer enhancer = new Enhancer();
        // 设置父类的字节码对象,
        enhancer.setSuperclass(NbCinema.class);
        // 设置回调函数
        enhancer.setCallback(this);
        // 创建代理对象
        NbCinema o = (NbCinema) enhancer.create(); // 生成的代理对象,为NbCinema类的子类
        return o;
    }

    
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("收费500");
        Object invoke = methodProxy.invokeSuper(o, objects);
        return invoke;
    }
}
3. 客户端从中介买票
public class CglibProxyTest {

    public static void main(String[] args) {
        GclibProxyFactory gcp = new GclibProxyFactory();
        NbCinema nbc = gcp.getProxyObject();
        // 执行sell方法时,会回调函数
        // public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
        // 进行执行
        nbc.sell();
    }
}

CGLIB实现动态代理的完整代码:
package com.csdn.proxy.cglibproxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

class NbCinema{
    public void sell(){
        System.out.println("售卖火车票!");
    }
}

class GclibProxyFactory implements MethodInterceptor{

    public NbCinema getProxyObject(){
        // 创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数
        Enhancer enhancer = new Enhancer();
        // 设置父类的字节码对象,
        enhancer.setSuperclass(NbCinema.class);
        // 设置回调函数
        enhancer.setCallback(this);
        // 创建代理对象
        NbCinema o = (NbCinema) enhancer.create(); // 生成的代理对象,为NbCinema类的子类
        return o;
    }

    
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("收费500");
        Object invoke = methodProxy.invokeSuper(o, objects);
        return invoke;
    }
}

public class CglibProxyTest {

    public static void main(String[] args) {
        GclibProxyFactory gcp = new GclibProxyFactory();
        NbCinema nbc = gcp.getProxyObject();
        // 执行sell方法时,会回调函数
        // public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
        // 进行执行
        nbc.sell();
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/848293.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号