当前位置: 首页 > article >正文

Java中的代理机制

目录

什么叫代理

静态代理

优缺点

优点:

缺点:

动态代理

JDK动态代理

核心类

JDK动态代理的实现

步骤

示例

特点

CGLIB动态代理

代理机制对比

总结


什么叫代理

代理模式是一种比较好理解的设计模式。简单来说就是我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。

代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。

Java支持两种代理机制:

  1. 静态代理(手动编写代理类)
  2. 动态代理(运行时动态生成代理类)

静态代理

静态代理中,我们对目标对象的每个方法的增强都是手动完成的(后面会具体演示代码),非常不灵活(比如接口一旦新增加方法,目标对象和代理对象都要进行修改)且麻烦(需要对每个目标类都单独写一个代理类)。实际应用场景非常非常少,日常开发几乎看不到使用静态代理的场景。

上面我们是从实现和应用角度来说的静态代理,从 JVM 层面来说, 静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class 文件。

静态代理实现步骤:

  1. 定义一个接口及其实现类;
  2. 创建一个代理类同样实现这个接口
  3. 将目标对象注入进代理类,然后在代理类的对应方法调用目标类中的对应方法。这样的话我们就可以通过代理类屏蔽对目标对象的访问,并且可以在目标方法执行前后做一些自己想做的事情
//首先,我们要写出联系代理类与目标类的桥梁,接口
public interface BuyClothes {public void clothes(String size);
}
//然后我们写出目标类,这里用ClothedFactory为例
public class ClothesFactory implements BuyClothes{@Overridepublic void clothes(String size) {System.out.println("已经为您定制好了大小为" + size +"的衣服");}
}
//写出静态代理类
public class StaticProxy implements BuyClothes {private ClothesFactory clothesFactory = new ClothesFactory();//重写核心方法@Overridepublic void clothes(String size) {//代理类与目标类建立起了桥梁clothesFactory.clothes(size);}
}
//模拟用户方面
public class Test {public static void main(String[] args) {StaticProxy staticProxy = new StaticProxy();//此处,用户访问目标类的路径:用户-->代理类StaticProxy---(以共同接口BuyClothes为中间节点)--->目标类ClothesFactory-->完成clothes()方法staticProxy.clothes("XXXL");}
}

优缺点

优点:

  • 简单直观
  • 适合代理少量方法

缺点:

  • 每个目标类需手动编写代理类
  • 代码冗余

动态代理

一个代理类代理多个目标类

  • 在静态代理中,我们代理的仅仅是一个方法,但是在平时,一个类通常会有很多方法,对应的对象也会调用多个类,那么此时如果还是用静态代理,就会特别麻烦,所以就有了动态代理

  • JDK中提供了一个方法,可以动态的实现新增的接口,该方法是

    Proxy.newProxyInstance() 

动态代理在运行时动态生成代理类,无需手动编写。Java提供两种实现方式:

  1. JDK动态代理(基于接口)
  2. CGLIB动态代理(基于类继承)

JDK动态代理

核心类

java.lang.reflect.Proxy;    //生成代理类java.lang.reflect.InvocationHandler;    //定义代理逻辑

JDK动态代理的实现

步骤
  • 创建接口,定义目标类要完成的功能
  • 创建目标类实现接口
  • 创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能
    • ​​​​调用目标方法
    • 增强功能
  • 使用Proxy类的静态方法,创建代理对象,并把返回值转为接口类型
示例
import java.lang.reflect.*;// 1. 定义接口和目标类(同上)// 2. 实现 InvocationHandler
class LogHandler implements InvocationHandler {private Object target;  // 目标对象public LogHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("【动态代理】调用方法: " + method.getName());Object result = method.invoke(target, args);  // 调用目标方法System.out.println("【动态代理】方法执行完毕");return result;}
}// 3. 生成代理对象
public class JdkProxyDemo {public static void main(String[] args) {UserService target = new UserServiceImpl();UserService proxy = (UserService) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new LogHandler(target));proxy.save();  // 通过代理调用}
}
特点
  • 要求:目标类必须实现接口
  • 性能:反射调用稍慢,但现代JVM已优化

CGLIB动态代理

  • cglib是第三方的工具库, 创建代理对象
  • cglib的原理是继承, cglib通过继承目标类,创建它的子类,在子类中重写父类中同名的方法, 实现功能的修改
  • 因为cglib是继承,重写方法,所以要求目标类不能是final的, 方法也不能是final的
  • 不需要目标类有接口,通过继承就可以
  • 经常用于框架中,例如Spring(SpringAOP)  

代理机制对比

特性静态代理JDk动态代理CGLIB动态代理
是否需要接口
生成方式手动编写运行时动态生成运行时动态生成
性能中等(反射调用)高(字节码增强)
使用场景简单、少量代理基于接口的代理无接口的类代理

总结

  • 静态代理:简单但冗余,适合少量固定增强
  • JDK动态代理:灵活,虚接口,适合SpringAOP等场景
  • CGLIB:更高效,可代理无接口类,但需注意final限制

根据需求选择合适代理方式

相关文章:

Java中的代理机制

目录 什么叫代理 静态代理 优缺点 优点: 缺点: 动态代理 JDK动态代理 核心类 JDK动态代理的实现 步骤 示例 特点 CGLIB动态代理 代理机制对比 总结 什么叫代理 代理模式是一种比较好理解的设计模式。简单来说就是我们使用代理对象来代替…...

Kotlin扩展函数提升Android开发效率

在Android开发中,Kotlin的扩展函数(Extension Functions)犹如一把神奇的瑞士军刀,它能显著提升代码简洁性和开发效率。以下是通过实战案例展示的扩展函数魔法手册: 一、扩展函数基础原理 // 给View添加渐显动画扩展 f…...

Jenkins linux安装

jenkins启动 service jenkins start 重启 service jenkins restart 停止 service jenkins stop jenkins安装 命令切换到自己的下载目录 直接用命令下载 wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.190.3-1.1.noarch.rpm 下载直接安装 rpm -ivh jenkins-2.190.3-…...

加速pip下载:永久解决网络慢问题

一文教你解决 pip 下载太慢了的问题 || 下载时因为网络不好中断下载的问题 一、找到 pip 配置文件路径 1.配置文件位置: Windows 系统的 pip 配置文件默认不存在,需要手动创建,路径为: C:\Users\你的用户名\pip\pip.ini 用户目…...

WPF 触发器 Trigger

触发器 Trigger 触发器(Trigger)是 WPF 中的一种机制: 当某个条件满足时,自动改变控件的某些属性,比如颜色、大小、透明度等。 换句话说,就是"如果……那么就……" 的一种规则。 常见触发器类…...

Webug4.0靶场通关笔记-靶场搭建方法(3种方法)

目录 一、虚拟机绿色版本 1. 开启phpstudy 2. 访问靶场 二、Docker版本 1.拉取镜像 2.启动镜像 三、源码安装版本 1. 搭建环境 (1)安装PHPStudy (2)WeBug4.0靶场源码 (3)安装Navicat &#xff…...

Python核心编程深度解析:作用域、递归与匿名函数的工程实践

引言 Python作为现代编程语言的代表,其作用域管理、递归算法和匿名函数机制是构建高质量代码的核心要素。本文基于Python 3.11环境,结合工业级开发实践,深入探讨变量作用域的内在逻辑、递归算法的优化策略以及匿名函数的高效应用&#xff0c…...

【Web】LACTF 2025 wp

目录 arclbroth lucky-flag whack-a-mole arclbroth 看到username为admin能拿到flag 但不能重复注册存在的用户 这题是secure-sqlite这个库的问题,底层用的是C,没处理好\0字符截断的问题 (在 Node.js 中,由于其字符串表示方式…...

【日撸 Java 三百行】综合任务 1

目录 Day 10:综合任务 1 一、题目分析 1. 数据结构 2. 相关函数基本知识 二、模块介绍 1. 初始化与成绩矩阵的构建 2. 创建总成绩数组 3. 寻找成绩极值 三、代码与测试 小结 拓展:关于求极值的相关算法 Day 10:综合任务 1 Task&…...

yocto的每个recipe都是在工作路径中完成

Yocto项目中每个Recipe的编译过程都会将源文件解压或搬运到tmp/work/下的特定工作目录,并在此完成所有构建任务。具体流程可分为以下关键步骤: 一、源码处理阶段 源码获取(do_fetch) Recipe通过SRC_URI变量指定源码来源(如Git仓库、HTTP下载或本地文件)。这些文件会被下载…...

玩转Docker | 使用Docker部署DailyTxT日记工具

玩转Docker | 使用Docker部署DailyTxT日记工具 一、DailyTxT介绍DailyTxT简介DailyTxT 特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署DailyTxT服务下载DailyTxT镜像编辑部署文件创建容器检查容器状态检查服务端口安全设置四、访问DailyTxT服务访问D…...

初等数论--欧拉定理及证明

0. 证明前置知识 同余类(剩余类) r n ‾ { x ∣ x m n r , m ∈ Z } \overline{r_n} \{ x| xmnr,m \in Z\} rn​​{x∣xmnr,m∈Z} r n ‾ \overline{r_n} rn​​表示模 n n n后余 r r r的同余类(剩余类) 比如 2 5 ‾ { ⋯…...

Oracle非归档模式遇到文件损坏怎么办?

昨天夜里基地夜班的兄弟,打电话说有个报表库连不上了,赶紧起来连上VPN查看一下,看到实例宕机了,先赶紧startup起来。 1.查看报错信息 环境介绍:Redhat 6.9 Oracle 11.2.0.4 No Archive Mode 查看alert log 关键报…...

机器人领域和心理学领域 恐怖谷 是什么

机器人领域和心理学领域 恐怖谷 是什么 恐怖谷是一个在机器人领域和心理学领域备受关注的概念,由日本机器人专家森政弘于1970年提出。 含义 当机器人与人类的相似度达到一定程度时,人类对它们的情感反应会突然从积极变为消极,产生一种毛骨悚然、厌恶恐惧的感觉。这种情感…...

树莓派4的v4l2摄像头(csi)no cameras available,完美解决

根据2025年最新技术文档和树莓派官方支持建议,no cameras available错误通常由驱动配置冲突或硬件连接问题导致。以下是系统化解决方案: 一、核心修复步骤 强制禁用传统驱动 sudo nano /boot/firmware/config.txt确保包含以下配置(2025年新版…...

每日一题:两个仓库的最低配送费用问题

文章目录 两个仓库的最低配送费用问题一、问题描述二、解题思路(一)初始假设(二)差值定义(三)选择最优(四)计算答案 三、代码实现四、代码分析(一)输入处理&a…...

华为私有协议Hybrid

实验top图 理论环节 1. 基本概念 Hybrid接口: 支持同时处理多个VLAN流量,且能针对不同VLAN配置是否携带标签(Tagged/Untagged)。 核心特性: 灵活控制数据帧的标签处理方式,适用于复杂网络场景。 2. 工作…...

Redis 基本数据类型解析

Redis 是一个高效的内存数据存储系统,广泛应用于缓存、消息队列、排行榜、实时数据处理等场景。其高性能的特点部分源自其丰富的数据结构,Redis 提供了多种数据类型,能够支持不同的使用需求。本文将详细介绍 Redis 的八种基本数据类型。 1. …...

数据库实验10

设计性实验 1.实验要求 1.编写函数FsumXXX,1~n(参数)求和; GO CREATE FUNCTION Fsum065 (n INT) RETURNS INT AS BEGIN DECLARE sum INT 0 WHILE n > 0 BEGIN SET sum sum n SET n n - 1 END RETURN sum END …...

Yocto是如何使用$D目录来构建文件系统的?

Yocto最终会将所有Recipe的${D}(部署目录)下的文件整合到根文件系统中,但这一过程并非简单收集所有内容,而是通过分阶段打包、依赖管理和定制化配置实现的。以下是核心机制的解析: 一、${D}目录的作用与文件收集原理 ${D}的定位 ${D}是模拟目标系统根文件结构的临时目录(…...

jflash下载时出现 Could not read unit serial number! 的解决方法

出现的原因是由于Jlink原厂固件SN码是-1 我用的版本是v6.40 解决方法:添加序列号 1.打开:J-Link commander 之后在命令栏输入:exec setsnxxxxxxxx 2.添加序列号到license,打开J-Link License Manager V6.40 jlink-v640下载软件…...

Linux 信号终篇(总结)

前文:本文是对信号从产生到被处理的过程中的概念和原理的总结,如果想了解具体实现,请查看前两篇博客:Linux 信号-CSDN博客、Linux 信号(下篇)-CSDN博客 一、信号的产生 1.1 信号产生的五种条件 ①键盘组…...

使用Kotlin Flow实现Android应用的响应式编程

在Android应用中使用Kotlin Flow实现响应式编程可以分为以下步骤,结合最佳实践和生命周期管理: 1. 添加依赖 在build.gradle中确保包含协程和生命周期相关依赖: dependencies {implementation("org.jetbrains.kotlinx:kotlinx-corouti…...

react中的用法——setDisabled dva dispatch effects

setDisabled 在react中,setDisabled通常是指通过状态管理来控制某个组件(如按钮、输入框等)的禁用状态。虽然react本身没有内置的setDisabled方法,但你可以使用useState钩子来实现类似的功能。以下是一个简单的示例,展…...

(九)Java Object类的使用全面解析

一、Object类概述 1.1 Object类在Java中的地位 在Java语言中,Object类是所有类的超类,位于类继承树的顶端。它是Java类层次结构中的根类,每个类都直接或间接继承自Object类。当我们定义一个类时,如果没有明确使用extends关键字指…...

LVGL对象(Objects)

文章目录 🧱 一、LVGL 中的对象(lv\_obj)🔹 lv\_obj\_t 的作用 🧩 二、对象的分类结构(类比继承)🧰 三、对象的创建与销毁✅ 创建对象示例:创建一个按钮❌ 删除对象 &…...

自然语言到 SQL 转换:开启智能数据库交互新时代

引言 随着人工智能技术的飞速发展,自然语言处理(NLP)领域取得了显著的进步。其中,将自然语言转换为 SQL 语句的技术尤为引人注目。这种技术能够帮助用户,尤其是那些不熟悉 SQL 的业务人员,快速从数据库中获…...

服务器配置错误导致SSL/TLS出现安全漏洞,如何进行排查?

SSL/TLS 安全漏洞排查与修复指南 一、常见配置错误类型‌ 弱加密算法与密钥问题‌ 使用弱密码套件&#xff08;如DES、RC4&#xff09;或密钥长度不足&#xff08;如RSA密钥长度<2048位&#xff09;&#xff0c;导致加密强度不足。 密钥管理不当&#xff08;如私钥未加密存…...

路由重发布

路由重发布 实验目标&#xff1a; 掌握路由重发布的配置方法和技巧&#xff1b; 掌握通过路由重发布方式实现网络的连通性&#xff1b; 熟悉route-pt路由器的使用方法&#xff1b; 实验背景&#xff1a;假设学校的某个分区需要配置简单的rip协议路由信息&#xff0c;而主校…...

C++修炼:stack和queue

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…...