Java浅记InvocationHandler实现动态代理

2024-01-10 10:58

本文主要是介绍Java浅记InvocationHandler实现动态代理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

抽象角色

/*** @author chaoxi* @create 2021-08-17 15:57*/
//待实现的接口
public interface UserService {void add();void delete();void update();void query();
}

实现了接口的真实角色

/*** @author chaoxi* @create 2021-08-17 15:58*/
//真实类,完成接口中的操作
public class UserServiceImpl implements UserService {public void add() {System.out.println("执行了add方法");}public void delete() {System.out.println("执行了delete方法");}public void update() {System.out.println("执行了update方法");}public void query() {System.out.println("执行了query方法");}
}

利用InvocationHandler实现动态代理的处理程序

其实这样实现该类,已经可以使用其作为工具类,方便以后实现动态代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** @author chaoxi* @create 2021-08-17 16:02*/
//按照目前的理解,其实就是实现了InvocationHandler的工具类
//用于创建一个代理类,并再代理类执行真实类实现的接口的方法时,执行代理类的特有的一部分处理程序
public class ProxyInvocationHandler implements InvocationHandler {//首先我们需要注入我们需要代理的真实对象,注意该真实对象已经实现了接口对象的方法private Object target;//使用set方法,是为了将真实对象注入,方便获取其实现的接口public void setTarget(Object target) {this.target = target;}//这里就直接返回了一个真实对象的代理类了/*this.getClass().getClassLoader():传入当前对象的类装载器,来定义该代理类target.getClass().getInterfaces():传入真实对象实现的抽象角色接口,让代理类也实现该接口this:不需要关注。直接将实现了InvocationHandler接口的对象传入即可*/public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}//这个类其实自己还是不太理解其运行机制,但是其大概的作用如下//此时的invoke方法,就相当于静态代理中,我们创建的静态代理类实现的真实类所实现的方法//Object result = method.invoke(target, args); 走的是真实类实现的接口的方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//其实,通过这行代码就能反应出:当生成的代理类在执行调用的接口方法时,通过反射机制,系统我们执行的是哪个方法//也从侧面告诉了我们,(此时的method已经获取了信息)底层代码也知道会去调用真实类中对应的接口方法log(method.getName());//在程序运行时,通过反射,获得真实类中实现了抽象角色(接口)的方法,并执行之。。。Object result = method.invoke(target, args);return result;}//此外还可以自定义一些代理类可以执行的特有逻辑,比如日志打印public void log(String name){System.out.println("执行的是真实类实现的接口的"+name+"方法");}
}

测试

/*** @author chaoxi* @create 2021-08-17 16:24*/
public class MyTest {public static void main(String[] args) {UserServiceImpl userService = new UserServiceImpl();ProxyInvocationHandler pih = new ProxyInvocationHandler();//相当于处理程序获得了真实类所实现的接口pih.setTarget(userService);//动态创建了一个userService的代理类UserService proxy = (UserService) pih.getProxy();//通过代理类来,执行对应接口中的方法proxy.add();}
}

运行结果

在这里插入图片描述

还不熟悉。需要进一步的理解。

这篇关于Java浅记InvocationHandler实现动态代理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/590547

相关文章

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri