【Java 基础】30 JDK动态代理

文章目录

    • 1.定义
    • 2.原理
    • 3.使用
      • 1)定义业务接口
      • 2)实现 InvocationHandler 接口
      • 3)生成代理类
    • 4.优点
    • 5.缺点
    • 总结

动态代理是一种重要的 设计模式,它允许在运行时生成代理类来代替实际的类。动态代理主要通过反射机制实现,为开发者提供了一种灵活且强大的方式来实现 AOP(面向切面编程)等功能。

1.定义

动态代理是一种在运行时生成代理类的机制,这些代理类在程序运行时创建,而不是在编译时静态定义。 JDK 动态代理主要基于 Java 的反射机制,通过在运行时创建代理类和对象,实现对实际类的代理。

动态代理通常用于在不修改原始类代码的情况下,向现有类添加额外的功能,例如日志记录性能监控事务处理等。

2.原理

JDK 动态代理的核心在于 java.lang.reflect 包中的 Proxy 类和 InvocationHandler 接口。代理类的创建过程主要包括以下步骤:

在这里插入图片描述

  • 定义接口: 定义一个业务接口,该接口将被动态代理类实现。
  • 实现 InvocationHandler 接口: 创建一个实现 InvocationHandler 接口的类,该类中包含了对原始类方法的代理逻辑。
  • 生成代理类: 使用 Proxy.newProxyInstance 方法生成代理类的实例,该方法需要传入类加载器、业务接口和 InvocationHandler 实现。
  • 调用代理方法: 通过代理类实例调用方法时,实际会调用到 InvocationHandler 中的 invoke 方法,从而执行代理逻辑。

3.使用

1)定义业务接口

interface Stu {
    void say(String name);
}

2)实现 InvocationHandler 接口

class HelloInvocationHandler implements InvocationHandler {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) {
        // 增加前处理
        System.out.println("执行方法前: " + method.getName());

        // 执行原始方法 say
        System.out.println("Hello, " + args[0]);

        // 增加后处理
        System.out.println("执行方法后: " + method.getName());

        return null;
    }
}

3)生成代理类

public class Demo {
    public static void main(String[] args) {
        // 创建 InvocationHandler 实例
        HelloInvocationHandler invocationHandler = new HelloInvocationHandler();

        // 生成代理类实例
        Stu proxy = (Stu) Proxy.newProxyInstance(
                Stu.class.getClassLoader(),
                new Class[] { Stu.class },
                invocationHandler
        );

        // 调用代理方法
        proxy.say("Cheney");
    }
}

输出结果:

执行方法前: say
Hello, Cheney
执行方法后: say

在上述示例中,HelloInvocationHandler 类实现了 InvocationHandler 接口,通过在代理方法的前后添加日志记录,这也就是传说中的 AOP 面向切面编程的效果。

4.优点

  • 灵活性: 动态代理可以代理任意实现了接口的类,不受具体类的限制。
  • 简化代码: 动态代理可以避免编写大量重复的代理类代码,减少代码冗余。
  • 解耦合: 动态代理实现了代理逻辑和业务逻辑的解耦,使得代理类可以复用于不同的业务场景。

5.缺点

  • 只能代理接口: JDK 动态代理只能代理实现了接口的类,对于没有实现接口的类无法进行代理。
  • 性能相对较低: 由于动态代理是在运行时生成代理类,因此相比静态代理,其性能相对较低。

总结

JDK 动态代理是一种强大而灵活的设计模式,它通过在运行时生成代理类来实现对实际类的代理,为实现 AOP 等功能提供了便捷的方式。通过使用 Proxy 类和 InvocationHandler 接口,开发者可以轻松地创建动态代理。虽然 JDK 动态代理有一些限制,如只能代理实现了接口的类,性能相对较低等,但在大多数场景下,其优势远远大于缺点,使得它成为 Java 编程中不可或缺的一部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/237005.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea__SpringBoot微服务09——员工管理系统,(Springboot解决乱码),thymeleaf语法,404页面。

员工管理系统 完整项目地址:一、首页实现(注意的点)二、国际化三、乱码解决四、登录功能实现(注意的点)五、登录拦截器(注意的点)六、展示员工列表(注意的点)1、前端页面…

【EMNLP 2023】面向Stable Diffusion的自动Prompt工程算法

近日,阿里云人工智能平台PAI与华南理工大学朱金辉教授团队合作在自然语言处理顶级会议EMNLP2023上发表了BeautifulPrompt的深度生成模型,可以从简单的图片描述中生成高质量的提示词,从而使文生图模型能够生成更美观的图像。BeautifulPrompt通…

被忽悠选择那些价格昂贵的知识付费平台?我有才知识服务平台手把手教你如何正确选择!

在当今的知识经济时代,一个高效、便捷的知识服务平台对于企业和个人至关重要。然而,市面上的众多知识服务平台中,许多产品存在高昂的费用、无用功能的堆砌、无法定制化等问题,让用户进退两难,甚至被忽悠掉入使用陷阱。…

深度解析TCP协议:特点、应用场景及市面上常见软件案例

目录 引言 TCP的特点 TCP的应用场景 市面上使用TCP的软件案例 引言 TCP(Transmission Control Protocol)是计算机网络中一种基于连接的、可靠的传输层协议。它具有一系列独特的特点,适用于广泛的应用场景。本文将深入研究TCP的特点、应用…

系统报错;由于找不到hid.dll,无法继续执行代码”的解决方案分享

在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是“找不到hid.dll,无法继续执行代码”。这个错误提示通常表示计算机缺少了一个重要的动态链接库文件,即hid.dll。本文将详细介绍hid.dll丢失对电脑的影响以及hid.dll是…

了解 git rebase

了解 git rebase 大多数人习惯使用 git merge 将更改从功能分支合并到主分支,但还有其他方法。我们是否曾经遇到过 git rebase 这个术语并想知道它是什么?或者我们可能听说过 rebase 和 merge ,但不确定何时使用哪个?不用担心&am…

报表生成器Stimulsoft用户手册:预览中具有动态数据排序的报告

Stimulsoft Reports 是一款报告编写器,主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署,如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等,在你的应用程序中嵌入报告设计器…

LAMP与LNMP架构

一、概述 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词,具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP(或…

win 10 hp hotkey uwp service占用内存高解决方法

hp hotkey uwp service hp hotkey uwp service high cpu hp audio analytics service high cpu 我是惠普战66笔记本, 这个问题断断续续好久了都没有得到解决, 作为一个能折腾的人, 热键也就亮度和声音是常用的, 而且鼠标进行这些操作也很简单, 最后想了想干脆直接把该服务关闭了…

​SSD在AI发展中的关键作用:从高速缓存到数据湖-2

二、大规模长期存储数据湖 大规模数据集: AI应用需要处理大量的数据,这些数据可能来自多个来源,包括图像、视频、文本、音频等。为了有效地管理这些数据,组织通常将其存储在大型的数据湖中。 容量扩展: 由于数据集的…

MS2502视频8位数模转换器

MS2502是低功率、超高速视频数模转换器。MS2502以从DC至20MHz的采样速率将 数字信号转换成模拟信号。由于高速工作,MS2502适合于数字电视、电脑视频处 理及雷达信号处理等数字视频应用。 MS2502工作于-20℃至85℃。 特点 1)8位分辨率 2&#xff09…

ubuntu安装MySQL8

1.下载mysql8 MySQL :: Download MySQL Installer (Archived Versions) 选择对应的mysql版本和对应的ubuntu版本图即可 2.下载后上传到sftp文件夹中,然后通过以下命令解压 tar -xvf mysql-server_8.0.29-1ubuntu20.04_amd64.deb-bundle.tar 3.依次安装即可 &#…

飞越 Flyway!

在数据库 Schema 变更这个领域,业界最老牌的两个产品是 Liquibase 和 Flyway,两者都有超过 15 年的历史。 Liquibase 和 Flyway 都是由商业公司在背后支撑的开源项目。Liquibase 相对更偏商业化一些,而 Flyway 的社区感更强。在中国&#xff…

ubuntu 命令行安装 conda

安装包地址: Index of / 找到对应的版本,右键点复制链接 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.shbash Anaconda3-2023.09-0-Linux-x86_64.sh https://linzhji.blog.csdn.net/article/details/126530244

Axure官方软件安装、汉化保姆级教程(带官方资源下载)

1.下载汉化包 百度云链接:https://pan.baidu.com/s/1lluobjjBZvitASMt8e0A_w?pwdjqxn 提取码: jqxn 2.解压压缩包 3.安装Axure 进行安装 点击next 打勾,然后next, 默认是c盘,修改成自己的文件夹(不要什么都放c盘里…

STL源码剖析笔记——适配器(adapters)

系列文章目录 STL源码剖析笔记——迭代器 STL源码剖析笔记——vector STL源码剖析笔记——list STL源码剖析笔记——deque、stack,queue STL源码剖析笔记——Binary Heap、priority_queue STL源码剖析笔记——AVL-tree、RB-tree、set、map、mutiset、mutimap STL源…

财务机器人(RPA)会影响会计人员从业吗?

财务机器人会对会计从业人员有影响。 不过是正面积极的影响。 它是财务人员工作的好助手好帮手。 具体展开聊聊财务RPA机器人是如何成为财务人员的好帮手。 财务机器人是在人工智能和自动化技术的基础上建立的、以软件机器人作为虚拟劳动力、依据预先设定的程序与现有用户系…

【CSS 背景详解】background

背景 background 基础 背景颜色 background-color background-color 设置元素的背景颜色。属性的值为颜色值或关键字"transparent"二者选其一。 CSS的color数据类型 https://developer.mozilla.org/zh-CN/docs/Web/CSS/color_value 背景图片 background-image ba…

vue3中实现el-tree通过ctrl或shift批量选择节点并高亮展示

一、看效果&#xff1a; 按住ctrl键实现单个多选 按住shift实现区间范围多选 二、代码&#xff1a; vue页面 <template><el-treeclass"w100%":data"$.treeData"ref"treeTab…