news 2026/2/8 20:57:49

Java动态代理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java动态代理

Java动态代理

一、概述

二、具体实现

2,1创建被代理对象(同时里面包含了相关的方法)

packagecom.itheima.mydynamicproxy1.zj;publicclassBigStarimplementsStar{// 先是创建一个类privateStringname;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicBigStar(Stringname){this.name=name;}publicBigStar(){}// 然后是有唱歌和跳舞的方法@OverridepublicStringsing(Stringname){System.out.println(this.name+"正在唱"+name);return"谢谢";}@Overridepublicvoiddance(){System.out.println(this.name+"正在跳舞");}}

2.2创建接口(里面是用来定义要代理的方法)

packagecom.itheima.mydynamicproxy1.zj;publicinterfaceStar{publicabstractStringsing(Stringname);publicabstractvoiddance();}

2.2创建用于生成代理对象的类(重点)

packagecom.itheima.mydynamicproxy1.zj;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;publicclassProxyUtill{// 下面静态方法的作用是给一个对象创建代理对象// 其中方法传递的形象就是需要代理的对象// 首先是创建静态方法publicstaticStarcreateProxy(BigStarbigStar){// 下面这是源码:// public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)// 其中第一个参数是类加载器,用于加载代理类// 第二个参数是用来指定代理类长成什么样,相当于是传递过来的属性// 第三个参数就是指定代理类干什么,也就是执行哪些方法// 那么下面就是逐一进行// 获取类加载器// 这句代码实际上做了两件事:1,.获取先找到是谁将当前类加载到内存。2.再次使用这个类加载器来加载我们的代理Starstar=(Star)Proxy.newProxyInstance(// 这就是上面的参数一ProxyUtill.class.getClassLoader(),// 类加载器干什么实际上是封装在接口当中的newClass[]{Star.class},newInvocationHandler(){@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{// 下面就是在判断这个类了if("sing".equals(method.getName())){// 下面就是代理做的一些准备工作System.out.println("准备话筒,收钱");}elseif("dance".equals(method.getName())){System.out.println("准备场地,收钱");}// 去找大明星唱歌或者跳舞// 指定是哪个明星,进行什么动作returnmethod.invoke(bigStar,args);}});//返回代理好的对象即可returnstar;}}

这里面其实分清楚层次再加上看看源码其实并不难理解,首先整体上是通过createProxy这个静态方法来生成代理对象,需要传递被代理对象作为形参,其底层又是运用Proxy的newProxyInstance方法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 11:20:36

好写作AI:你的24小时论文顾问——当灵感在凌晨三点敲门,我永远在线

导师的回复在“48小时内”&#xff0c;图书馆在“22点闭馆”&#xff0c;而你的论文瓶颈&#xff0c;总发生在凌晨2点47分——这个学术世界似乎从未为你调整过时区。写论文最深的孤独感&#xff0c;往往不在于独自研究&#xff0c;而在于当那个关键的疑问、突如其来的灵感或致命…

作者头像 李华
网站建设 2026/2/8 8:17:54

1.3 第一个C程序:Hello World深度解析【20260206】

文章目录 1.3 第一个C程序:Hello World深度解析 1.3.1 为什么从"Hello World"开始? 1.3.2 完整的Hello World程序 1.3.3 逐行深度解析 第1行:`#include <stdio.h>` 第2行:空白行 第3行:`int main() {` 第4行:`printf("Hello, World!\n");` 第5…

作者头像 李华
网站建设 2026/2/8 19:32:46

超实用!低查重AI教材生成工具,助力快速完成专业教材编写

AI教材写作&#xff1a;突破传统&#xff0c;高效创作 许多教材编写者常常会遇到这样的困扰&#xff1a;虽然教材的正文内容经过精心雕琢&#xff0c;但因为缺乏配套资源&#xff0c;导致教学效果受到影响。设计课后练习时&#xff0c;题型需要有梯度&#xff0c;但却常常缺乏…

作者头像 李华
网站建设 2026/2/7 19:58:03

[STM32L5] 【STM32L562 DK试用】基础外设体验

开发板自带了一块240*240分辨率的触摸屏&#xff1a;本次基于官方demo进行修改&#xff0c;从而在屏幕上显示相应的文字。首先进行系统和时钟的初始化&#xff1a;复制HAL_StatusTypeDef HAL_Init(void){ HAL_StatusTypeDef status HAL_OK; /* Set Interrupt Group Priorit…

作者头像 李华
网站建设 2026/2/7 16:06:11

[STM32L5] STM32L562E-DK开发板的BSP学习

该工程所在位置 STM32Cube_FW_L5_V1.5.0\Projects\STM32L562E-DK\Examples\BSP\MDK-ARM 打开工程&#xff0c;找到main.c的main函数&#xff0c;查看硬件初始化函数复制static void SystemHardwareInit(void){ /* Init LEDs */ if (LedInitialized ! SET) { if (BSP_L…

作者头像 李华