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

Java代理模式详解

Java代理模式详解

概念

代理模式是一种设计模式,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。在Java中,代理模式主要分为静态代理和动态代理。

静态代理

静态代理是在编译时就已经确定好代理类要代理谁。在静态代理中,我们创建一个代理类来实现与目标对象相同的接口,并在代理类中维护一个目标对象的引用。当客户端调用代理类的方法时,实际上是通过代理类间接地调用目标对象的方法。

示例

假设我们有一个接口Subject和一个实现类RealSubject

public interface Subject {void request();
}public class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject: Handling request.");}
}

接下来,我们创建一个代理类ProxySubject,它实现了Subject接口并持有一个RealSubject的实例:

public class ProxySubject implements Subject {private RealSubject realSubject;public ProxySubject() {this.realSubject = new RealSubject();}@Overridepublic void request() {preRequest();realSubject.request();postRequest();}private void preRequest() {System.out.println("ProxySubject: Preparing request.");}private void postRequest() {System.out.println("ProxySubject: Request completed.");}
}

ProxySubject中,我们在调用realSubject.request()之前和之后分别执行了一些额外的操作。这就是静态代理的一个典型用法:在目标方法执行前后插入额外的逻辑。

动态代理

动态代理与静态代理的主要区别在于,动态代理是在运行时动态地生成代理类。在Java中,我们可以通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。

示例

首先,我们定义一个InvocationHandler的实现:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class DynamicProxyHandler implements InvocationHandler {private Object target;public DynamicProxyHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {preRequest();Object result = method.invoke(target, args);postRequest();return result;}private void preRequest() {System.out.println("DynamicProxyHandler: Preparing request.");}private void postRequest() {System.out.println("DynamicProxyHandler: Request completed.");}public static Object newInstance(Object target) {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new DynamicProxyHandler(target));}
}

然后,我们可以这样使用动态代理:

Subject realSubject = new RealSubject();
Subject proxySubject = (Subject) DynamicProxyHandler.newInstance(realSubject);
proxySubject.request();

这段代码首先创建了一个RealSubject实例,然后通过DynamicProxyHandler.newInstance()方法创建了一个代理对象。当我们调用proxySubject.request()时,实际上会调用DynamicProxyHandler中的invoke()方法,从而实现在目标方法执行前后插入额外的逻辑。

总结

代理模式在Java中主要有两种实现方式:静态代理和动态代理。静态代理在编译时就已经确定好代理类要代理谁,而动态代理则可以在运行时动态地生成代理类。这两种方式都可以实现在目标方法执行前后插入额外的逻辑,但动态代理更加灵活和强大。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • React 的 KeepAlive 实战指南:深度解析组件缓存机制
  • 【网络爬虫技术】(1·绪论)
  • 深度学习高效性网络
  • 2024钉钉杯B题医疗门诊患者及用药数据案例分析
  • SolidWorks设计库的应用
  • 基于Golang+Vue3快速搭建的博客系统
  • 顺序表和单链表的代码实现
  • Ubuntu22.04安装Go语言的几种方式
  • Nginx系列-12 Nginx使用Lua脚本进行JWT校验
  • 【第三天】计算机网络 HTTP请求中常见的状态码 什么是强缓存和协商缓存
  • Spark进化论:从RDD到DataFrame,揭秘Spark SQL如何成为性能引擎的幕后英雄
  • 【数据结构】排序
  • Linux 安装 GDB (无Root 权限)
  • 【个人亲试最新】WSL2中的Ubuntu 22.04安装Docker
  • 构造+有序集合,CF 1023D - Array Restoration
  • css选择器
  • JavaScript实现分页效果
  • Java方法详解
  • Linux后台研发超实用命令总结
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • python学习笔记 - ThreadLocal
  • React+TypeScript入门
  • vue2.0项目引入element-ui
  • vue的全局变量和全局拦截请求器
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 记一次用 NodeJs 实现模拟登录的思路
  • 聊一聊前端的监控
  • 微信开源mars源码分析1—上层samples分析
  • 小程序button引导用户授权
  • 赢得Docker挑战最佳实践
  • Mac 上flink的安装与启动
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • #define、const、typedef的差别
  • #java学习笔记(面向对象)----(未完结)
  • $$$$GB2312-80区位编码表$$$$
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)测试工具
  • (二十三)Flask之高频面试点
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三)mysql_MYSQL(三)
  • (三分钟)速览传统边缘检测算子
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (万字长文)Spring的核心知识尽揽其中
  • (一)为什么要选择C++
  • (转)scrum常见工具列表
  • (转载)虚函数剖析
  • .java 9 找不到符号_java找不到符号
  • .net core 6 redis操作类
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net Core中Quartz的使用方法
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .netcore 获取appsettings