CGLIB实现代理设计模式 | 带你学《Java语言高级特性》之九十六

简介: 本节介绍了利用第三方包--CGLIB开发包来实现代理设计模式。

上一篇:静态代理设计模式 | 带你学《Java语言高级特性》之九十五
【本节目标】
本节介绍了利用第三方包--CGLIB开发包来实现代理设计模式。

CGLIB实现代理设计模式

从Java的官方来讲,已经明确的要求了如果想要实现代理设计模式,那么一定是基于接口的应用,所以在官方给出的Proxy类创建代理对象时,都需要传递该对象所有的接口信息:

Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);

但是这个时候有一部分开发者就认为不应该强迫性的基于接口实现代理设计,所以一部分开发者就开发出了一个CGLIB开发包,利用这个开发包就可以实现基于类的代理设计模式。
1、CGLIB是一个第三方的程序包,需要单独在Eclipse中进行配置,程序包的路径为:D:jar-libcglib-nodep-3.2.6.jar,那么需要打开Eclipse项目属性安装第三方开发包;
image.png

2、编写程序类,该类不实现任何接口。

class Message  {
    public void send() {
        System.out.println("【发送消息】www.mldn.cn");
    }
}

3、利用CGLIB编写代理类,但是这个代理类需要做一个明确,此时相当于使用了类的形式实现了代理设计的处理,所以该代理设计需要通过CGLIB来生成代理对象,定义一个代理类:

class MLDNProxy implements MethodInterceptor{  //拦截器配置
    private Object target;  //保存真实主题对象
    public MLDNProxy(Object target){
        this.target = target;
    }
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        Object returnData = null;
        if(this.connect()){
            returnData = method.invoke(this.target,args);
            this.close();
        }
        return returnData ;
    }
    public boolean connect(){
        System.out.println("【消息代理】进行消息发送通道的连接。");
        return true;
    }
    public void close(){
        System.out.println("【消息代理】关闭消息通道。");
    }
}

4、此时如果想创建代理类对象,则就必须进行一系列的CGLIB处理。

public class JavaAPIDemo {
    public static void main(String[] args)throws Exception{
        Message realObject = new Message();   //真实主体对象
        Enhancer enhancer=new Enhancer();  //负责代理操作的程序类
        enhancer.setSuperclass(realObject.getClass());  //假定一个父类
        enhancer.setCallback(new MLDNProxy(realObject));  //设置代理类
        Message proxyObject= (Message) enhancer.create();  //创建代理对象
        proxyObject.send();
    }
}

在进行代理设计模式定义的时候,除了使用可以接口之外,还可以不受接口限制而实现基于类的代理设计,但从正常的设计角度来讲,强烈建议还是基于接口的设计会比较合理。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:反射取得Annotation信息 | 带你学《Java语言高级特性》之九十七
更多Java面向对象编程文章查看此处

相关文章
|
2月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
3月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
82 2
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
42 4
|
2月前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
58 4
|
3月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
117 3
|
3月前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
32 2
|
3月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
58 0
[Java]23种设计模式
|
3月前
|
设计模式 网络协议 Java
05.静态代理设计模式
《静态代理设计模式》详细介绍了静态代理的基本概念、原理与实现、应用场景及优缺点。主要内容包括静态代理的由来、定义、使用场景、实现方式、结构图与时序图,以及其在降低耦合、保护对象权限等方面的优势。同时,文章也指出了静态代理的局限性,如缺乏灵活性、难以复用、难以动态添加功能等,并介绍了动态代理如何弥补这些不足。最后,通过多个实际案例和代码示例,帮助读者更好地理解和应用静态代理模式。
50 4
|
3月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
66 3