java:代理模式

代理模式

动态代理是一种在运行时生成代理对象的机制,通过代理对象可以在不修改原始对象的情况下,对其进行额外的操作和增强.

被代理对象就是豌豆射手

代理角色就是火炬树桩

动态代理的使用场景

AOP(Spring框架技术):

动态代理可以在不修改原始代码的情况下,通过拦截方法的调用来添加额外的行为,如日志记录,性能监控,事务管理等.

延迟加载(Hibernate框架技术):动态代理可以用于延迟加载对象,当真正需要使用对象时,代理对象才会去加载和初始化真实对象,从而提高性能

简化数据库操作(MyBatis框架技术):通过动态代理,MyBatis可以自动生成实现了Mapper接口的代理类

在底层的代码中动态代理比较常见.许多框架使用动态代理来实现各种功能,动态代理可以在不修改原始代码的情况下,通过生成代理类来拦截和处理方法调用,因此动态代理可以实现更加灵活和可扩展的功能.

代理模式:

静态代理

代理类存在于程序运行之前,前提是需要有一个接口,代理类和被代理类都需要实现此接口,以便于让代理对象能够对被代理对象进行代理操作.

存在一个抽象角色(接口)

定义被代理角色实现接口

定义代理角色实现接口,增强被代理角色的功能

在代理角色中传入被代理角色对象,即可在代理角色的方法中增强被代理角色的方法

调用+增强功能

复制代码
动态代理(重点)
不需要创建代理类

而是通过JDK提供的Proxy类在程序运行时,运用反射机制动态创建而成,这就是所谓的动态代理.

动态代理相关的API

java.lang.reflect.Proxy类创建动态代理类对象

java 复制代码
Proxy.newProxyInstance()
//静态方法用于创建代理对象
//传入三个参数
//1,类加载器 
ClassLoader loader
//2,要实现的接口列表 需要和被代理类接口一致
Class[] interfaces
//3,具体实现代理逻辑的接口
InvocationHandler h
CLassLoader

和被代理角色使用同一个类加载器

类加载器:将字节码文件加载到内存的工具

使用字节码文件.getClassLoader获取

Class[] interfaces

接口的字节码数组

使用字节码文件.getInterfaces()获取

InvocationHandler

InvocationHandler接口控制代理对象的具体执行逻辑

InvocationHandler的实现类对象

需要重写invoke方法

invoke方法:代理对象调用方法时,就会触发此方法执行(回调方法)

需要在此方法中拦截并增强需要增强的功能(判断)

在方法中使用方法实例的invoke方法调用方法,在前后做增强处理

java 复制代码
invoke()方法
//处理代理对象方法的调用
//接收三个参数
//1,代理对象(Object),代理对象实例,没什么用
//2,当前调用的方法(Method),被调用的方法实例
//3,方法的参数(Object[]),代理对象调用方法时传入的参数列表
相关推荐
空空kkk3 分钟前
MyBatis——代理Dao方式的增删改查操作
java·数据库·mybatis
T***u3336 分钟前
JavaScript在Node.js中的流处理大
开发语言·javascript·node.js
Seven9713 分钟前
线性数据结构
java
带刺的坐椅16 分钟前
Solon 不依赖 Java EE 是其最有价值的设计!
java·spring·web·solon·javaee
青云交19 分钟前
Java 大视界 -- 基于 Java 的大数据分布式存储在数字媒体内容存储与版权保护中的应用
java·性能优化·区块链·分布式存储·版权保护·数字媒体·ai 识别
未来之窗软件服务20 分钟前
幽冥大陆(三十四)VUE +node智慧农业电子秤读取——东方仙盟炼气期
开发语言·vue·电子秤·东方仙盟·东方仙盟sdk
踢球的打工仔36 分钟前
PHP面向对象(5)
android·java·php
Rover.x38 分钟前
错误:找不到或无法加载主类 @C:\Users\AppData\Local\Temp\idea_arg_file223456232
java·ide·intellij-idea
4***172740 分钟前
使用 java -jar 命令启动 Spring Boot 应用时,指定特定的配置文件的几种实现方式
java·spring boot·jar
CoderYanger1 小时前
优选算法-字符串:63.二进制求和
java·开发语言·算法·leetcode·职场和发展·1024程序员节