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

Java中的静态代理与动态代理(Proxy.newProxyInstance)

代理模式是23种设计模式中比较常用的一种,属于结构型设计模式。代理的实现方式有三种:静态代理、动态代理以及使用 cglib 或 bytebuddy 开源库创建的代理,这里我们关注前两种常用的代理方式。
一、静态代理
二、动态代理

这里介绍基于Proxy.newProxyInstance()方法的动态代理实现

1、定义目标对象和代理对象都要实现的接口

// 目标接口
public interface GameService {String beginGame(String s);void playGame(String s);
}

2、定义目标对象的类

// 目标对象(被代理的对象)
public class GameServiceImpl implements GameService {public String beginGame(String game) {System.out.println("玩家进入游戏:" + game);return game;}public void playGame(String game) {System.out.println("玩家开始游戏: " + game);}
}

3、实现InvocationHandler接口,重写invoke()方法,定义处置器的类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;/*** 调用处置器:1、承载目标对象;2、调用目标对象的方法*/
public class GameInvocationHandler implements InvocationHandler {// 目标对象private final Object target;public GameInvocationHandler(Object target) {this.target = target;}/*** 调用目标对象的方法** @param proxy  当前代理对象本身* @param method 被调用的方法对象* @param args: 调用方法时传递的参数数组*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 前置逻辑System.out.println("before--" + method.getName());// 调用目标对象的方法Object result = method.invoke(target, args);// 后置逻辑System.out.println("after--" + method.getName());return result;}
}

4、调用Proxy.newProxyInstance()方法生成和使用动态代理对象

import java.lang.reflect.Proxy;/*** 动态代理的主要优势在于其能够在不修改原有代码的基础上,对目标对象的功能进行增强或修改。* 但需要注意的是,JDK动态代理只能为实现接口的类创建代理实例,无法直接代理没有实现接口的类 !!!*/
public class Main {public static void main(String[] args) {// 创建目标对象GameService gameServiceImpl = new GameServiceImpl();// 创建代理对象方法调用处理器GameInvocationHandler handler = new GameInvocationHandler(gameServiceImpl);// Proxy.newProxyInstance()是Java反射API中用于创建动态代理对象的核心方法(运行时动态生成代理类,无需预先编码)GameService proxy = (GameService) Proxy.newProxyInstance (// 指定一个类加载器,用于加载生成的代理类到JVM(TODO 不必是目标类型加载器,如可以使用当前类)/// gameServiceImpl.getClass().getClassLoader(),Main.class.getClassLoader(),// 指定代理类需要实现的一组接口和方法。动态代理只能基于接口工作,因此目标对象至少需要实现一个接口,// 代理类会实现这些接口,并且所有的接口方法调用都会被转发给InvocationHandler处理。gameServiceImpl.getClass().getInterfaces(),// 指定代理对象方法调用处置器(InvocationHandler接口的实现类),代理对象方法的调用会被转发到该处置器的invoke()方法。// 这是动态代理的核心部分,它允许我们在实际调用业务逻辑之前或之后插入额外的行为,如性能监控、日志记录等。handler);// 通过代理对象调用目标对象的方法proxy.beginGame("猫鼠游戏");proxy.playGame("猫鼠游戏");}
}
http://www.dtcms.com/a/596899.html

相关文章:

  • 2528. 最大化城市的最小电量
  • 网站建设带服务器新浪舆情通官网
  • 16.udp_socket
  • OpenAI 新推 GPT-5-Codex-Mini:一款针对开发者的轻量级编码助手
  • GPTs智能体案例解析(小红书文案、流程图设计与编辑)
  • 广告宣传网站免费行情软件网站大全
  • 机器学习过拟合和正则化
  • 【SpringBoot】35 核心功能 - 高级特性- Spring Boot 中的Profile 环境配置详解
  • 富利建设集团有限公司网站网络维护怎么做
  • 【VSCode】【Clangd】Win下的基于LLVM/Clangd+Clangd插件+MINGW+CMake的VSCode配置C/C++开发环境的详细教程
  • Java大厂面试真题:从Spring Boot到AI微服务的三轮技术拷问(二)
  • openEuler入门学习教程,从入门到精通,云计算与 Linux 操作系统概述(1)
  • 3.2.STM32-LED闪烁LED流水灯蜂鸣器
  • 4-ARM-PEG-Methoxy(2),化学特性、纯化策略与表征方法
  • 4-ARM-PEG-DSPE(2),多功能PEG脂类偶联分子及反应原理
  • php做的网站安全吗宣传推广方案怎么写
  • 建设网站的发布与推广分销商城的服务商
  • Linux:文件 mmap 读写流程简析
  • Ros1 Noetic(本地)和Ros2 Humble(docker)之间相互通信及设置初始位姿
  • 使用 Docker Compose 部署 Redis 单节点 和 主从架构
  • 群晖NAS上使用最新版WordPress安装部署个人的博客或网站
  • 在Visio中保存PDF时去除空白区域
  • AI学习路线图2025:从入门到进阶的完整指南
  • 电气工程师求职问答-初级篇
  • Learn Git Branching
  • 凡科快图网站中医院网站源码
  • 太原网站快速排名提升河北婚庆网站建设定制
  • [Spring 注解详解]为何 @Service 不仅仅是 @Component?
  • 前端高频面试题之Vue(初、中级篇)
  • 谷歌云发布 Axion Arm 处理器与 TPU v5p,加速 AI 基础设施闭环