java JDK动态代理

Java进阶之 JDK动态代理与Cglib动态代理 一、动态代理概述:     与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式【Proxy Pattern】),     动态代理类的字节码是在程序运行时由Java反射机制动态生成。     注意:        1、AspectJ是采用编译时生成AOP代理类,具有更好的性能,但是需要使用特定的编译器进行处理       2、Spring AOP 阅读详情

本篇随笔是对java动态代理中的JDK代理方式的具体实现。

首先需要定义一个接口,为其定义了两个方法:


 
public interface UserService { public void add(); public void delete(); } 

然后需要一个实现这个接口的实现类:


 
public class UserServiceImpl implements UserService { @Override public void add() {    //添加一些操作 System.out.println("UserServiceImpl中的add()方法被执行了"); } @Override public void delete() {    //添加一些操作 System.out.println("UserServiceImpl中的delete()方法被执行了"); } } 

此时如果要在调用add()方法和delete()方法时先输入一句话:System.out.println("动态代理开启");

第一种方式:直接在方法体内部输出,此时就会出现一个问题:“硬编码”,对以后的扩展不方便。

第二种方式:使用java中动态代理机制,主要有JDK和CGLIB两种方式。本文主要使用JDK的方式。

此时,创建一个动态代理类:


 
public class DynaProxyInvocationHandler implements InvocationHandler { // 定义被代理对象,该对象必须实现了至少一个接口 private Object target; // 定义代理方法,该方法代理后的返回值类型是被代理对象原类型 public Object Proxy(Object target) { this.target=target; return Proxy.newProxyInstance( this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this); } /** * 当一个类实现了InvocationHandler接口后,必须实现invoke方法 * 而这个方法就是增强被代理对象的方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("动态代理开启"); return method.invoke(this.target, args); } } 

其中的Proxy是JDK为我们提供的动态代理对象,该对象提供了newProxyInstance()来进行初始化,参数说明如下:

第一个参数:被代理对象的类装载器

第二个参数:被代理对象所实现的接口

第三个参数:实现InvocationHandler接口的类

而其中的invoke方法中有着三个参数:

第一个参数:代理对象,一般在动态代理中不会使用。

第二个参数:被代理对象所执行的方法

第三个参数:被代理对象所执行的方法的参数列表

此时,可以建立一个测试类查看一下效果:


 
public class DynaProxtTest { public static void main(String[] args) { // 创建被代理对象 UserService userService = new UserServiceImpl(); // 对象UserService进行代理 UserService us = (UserService)new DynaProxyInvocationHandler().Proxy(userService); //调用代理后的方法 us.add();    System.out.println("============="); us.delete(); } } 

此时控制台的输出会是:


 
动态代理开启 UserServiceImpl中的add()方法被执行了 ============= 动态代理开启 UserServiceImpl中的delete()方法被执行了 

此时,如果要对代理方法进行限制,可以使用以下方法:


 
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; if(method.getName().contains("add")) { System.out.println("动态代理开启"); result = method.invoke(this.target, args); }else { result = method.invoke(this.target, args); } return result; } 

此时控制台的输出会是:


 
动态代理开启 UserServiceImpl中的add()方法被执行了 ============= UserServiceImpl中的delete()方法被执行了   

因为Spring的AOP就是通过动态代理的机制实现的,所以还是需要好好的理解动态代理的机制的。

欢迎工作一到八年的Java工程师朋友们加入Java高级交流群:854630135

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有直播平台和讲师直接交流噢

哦对了,喜欢就别忘了关注一下哦~

深入理解Java动态代理与代码模拟JDK实现动态代理【JAVA核心】 前言文章目录如下,便于快速索引一、什么叫代理?二、什么叫动态代理?三、动态代理有什么优势?四、动态代理的JDK实现原理    4.1核心类/接口    4.2 代理类$Proxy0解析    4.3 动态代理的经典使用五、手写代码模拟JDK动态代理六、参考资料项目源码已经上传,欢迎点击下载~先将自己总结的Java动态代理UML图放在前面,用相同的颜色代表同一个或本质上相同的类与方法,便于大家理解。... 阅读详情

相关推荐

Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理

上面的代码表明,首先通过getProxyClass获得这个代理类,然后通过c1.getConstructor()拿到构造函数,最后一步,通过cons.newInstance返回这个新的代理类的一个实例,注意:调用newInstance的时候,传入的参数为h,即我们自己定义好的InvocationHandler类,先记着这一步,后面我们就知道这里这样做的原因。也就是说,JDK的动态代理,是通过一个叫Proxy的类来实现的,我们继续跟进去,看看Proxy类的newProxyInstance()方法。

智慧演绎,无处不在 3万+

Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

上篇介绍了一下静态代理:Java中的代理模式——静态代理以及分析静态代理的缺点 也分析了一下静态代理的缺点: 1、由于静态代理中的代理类是针对某一个类去做代理的,那么假设一个系统中有100个Service,则需要创建100个代理类 2、如果一个Service中有很多方法需要事务(增强动作),发现代理对象的方法中还是有很多重复的代码 3、由第一点和第二点可以得出:静态代理的重用性不强 那怎...

曹举的个人博客 2万+

面试必考之Java的cglib和jdk动态代理对比

1、作用范围 jdk:适用于实现接口的类。主要面向接口。 cglib:通过继承类的方式来实现,该类应该为非final类型。 2、技术实现 jdk:实现InvocationHandler横切+反射 cglib:实现MethodInterceptor 接口。通过修改class文件字节码来对方法进行增强。 3、各jdk版本性能 1.6,1.7: cglib 优于 jdk 1.8: jdk 优于 cglib 为什么? cglib通过fastclass来......

老王随聊 2747

Java JDK 动态代理(AOP)使用及实现原理分析

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息 ​ 一、什么是代理? 二、Java 动态代理类 三、JDK的动态代理怎么使用? 四、动态代理怎么实现的? 五、结论 一、什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。 代理模式UML图: 简单结构示意图: 为了保持行为的...

勿忘初心 16万+

利用PLECS实现Boost变换器的闭环控制仿真与优化

本文详细介绍了如何利用PLECS仿真软件实现Boost变换器的闭环控制与优化。从基础原理到开环系统搭建,再到闭环控制设计与动态优化,提供了完整的仿真实践指南。通过PLECS的仿真功能,工程师可以有效诊断问题、优化参数,并实现高性能的DC-DC变换器设计。

weixin_42527401的博客 325

LoRa物联网实战:用新大陆模块打造智能LED呼吸灯(附完整代码解析)

本文详细介绍了如何利用新大陆LoRa模块实现工业级智能LED呼吸灯的设计与开发。通过256级PWM调制的呼吸灯效果,结合LoRa无线控制技术,实现设备状态的可视化反馈和多设备同步控制。文章包含完整的硬件选型、电路设计、算法优化和代码实现,特别适合物联网开发者和硬件工程师参考。

github5actions的博客 87

Java中的JDK动态代理

Java中JDK动态代理,AOP是对动态代理的进一步规范化,CGLB动态代理

weixin_44362089的博客 5562

西门子博图指令(定时器操作三)

西门子博图定时器中复位定时器功能指令介绍

yue008的博客 8874

Java——JDK动态代理

动态代理是指代理类对象在程序运行时由JVM根据反射机制动态生成的。动态代理不需要定义代理类的,java源文件。动态代理其实就是jdk运行期间,动态创建class字节码并加载到JVM。动态代理的实现方式常用的有两种:使用JDK代理,与通过CGLlB动态代理。

m0_73671382的博客 7677

Codex入门19-数据库操作(解放双手:用自然语言写SQL、建表和数据迁移)

写 SQL 是后端开发的日常,但复杂的 JOIN、子查询、窗口函数总让人头疼。本文教你用 Codex CLI 实现:自然语言直接生成 CREATE TABLE、复杂 SQL 查询、数据库迁移脚本(Prisma/Knex/Alembic)、ORM 模型代码(SQLAlchemy/TypeORM)、甚至自动生成数据库文档。重点强调安全红线——永远不要让 AI 直接连接生产数据库。从需求描述到完整数据库层代码,一篇搞定。

yueyeguzhuo的专栏 234

嵌入式内存管理之“LittleFS文件系统”开发(附LittleFS项目源码)

本文介绍了如何在嵌入式系统中实现 LittleFS 文件系统,并结合 Flash 存储进行数据管理。通过详细的代码示例,展示了如何配置、挂载 LittleFS 文件系统,并进行文件操作,如读取、写入和更新数据。特别地,博客通过实际应用演示了如何实现启动计数功能,以及如何处理文件系统的格式化和挂载过程。该示例帮助读者掌握在资源受限的嵌入式环境中实现高效文件存储管理的关键技术。

Bit_Dong的博客 3193

Java动态代理之JDK动态代理

在介绍动态代理前,我们需要先搞清楚什么是代理模式。代理模式是一种很常见的设计模式,简而言之就是通过创建一个代理对象,让调用方来访问代理对象,从而实现对真实对象的保护或增强。Spring AOP、Mockito测试框架生成的mock或spy对象都是代理模式的例子。其实,代理并不是一个编程中才有的概念,生活中委托中介帮忙租房子,或者找律师打官司,都可以看作代理模式的应用。这样我们就完成了代理模式的编写,下面可以写个测试类看看效果输出结果为。

weixin_47372115的博客 868

WinCC 7.5 读取 SQL server2016 中的表格数据

环境 win10 SQL Server 2016 WinCC V7.5 SP2 1 安装SQL Server 2016 2 选择服务器名称 .\WINCC 3 建数据库

skr? 7143

【Java】万字解读Java的动态代理(JDK原生动态代理、CGLIB动态代理)

动态代理在Java中有着广泛的应用,比如 Spring AOP、RPC 远程调用、Java 注解对象获取、日志、用户鉴权、全局性异常处理、性能监控,甚至事务处理等。JDK原生动态代理和CGLIB 动态代理。

✈ 正在努力 の 寒江(StudiousTiger) ✌ 呐 ✈ 1万+

《AI 时代FPGA的全栈开发实战・从入门到精通》专栏启动说明

《智驱FPGA》专栏面向初学者,聚焦AI时代FPGA开发新范式,以ChatGPT、ICCoder2.0等工具全程辅助,覆盖纯逻辑、Zynq软硬协同、端侧AI加速、高速接口等核心方向。通过126节图文+14个实战项目,传授AI生成代码、Prompt工程、时序优化等能力,助力学员从零成长为具备工程竞争力的FPGA工程师,结业可独立完成完整项目并写入简历。

现任某外企的算法工程师!专注于人工智能、嵌入式、FPGA、论文写作四大主题的教程和经验分享!辅导请➕v :sci666888999 175

Linux 内核参数:meminfo

内存管理是一个相对复杂的内核模块,错综复杂的数据结构和管理逻辑。Linux 内核为了帮助开发者从宏观上把握内存的使用情况,在几大核心数据结构中都有相应的计数统计,如物理页面使用情况、伙伴系统分配情况、内存管理区的页面使用情况、内存回收扫描回收情况、内存规整触发情况等等。本文要分析的节点meminfo是Linux 操作系统中查看系统内存最准确(meminfo 中有内存黑洞)的方法,它包含当前时刻系统的所有物理页面的信息。

私房菜 2417

Java JDK动态代理JDK和CGLIB动态代理

0. 代理     代理是一种设计模式, 一种不直接访问目标, 通过代理访问目标的设计模式. 好像等于白说?代理其实在很多地方都有使用到, 不只是Java,在nginx中有正向代理反向代理, 生活中有律师代理他的当事人进行变护.用Java来解释: class A { public void add() } class B { private A a; public B(A a){ this.a = a; } public void add() {

WAXXD的博客 525

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java JDK 动态代理和 CGLIB 动态代理的区别是什么?

定义一个实现。

smart_an的专栏 1102

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JAVA JDK动态代理图解

JAVA的动态代理是一个非常重要的实现技术,在jdk以及spring,hibernate等框架中大量应用。 为什么动态代理这么重要呢?首先,什么是动态,什么是代理? 动态是相对静态而言,如java是先编译后运行,那么其代码是静态方式被读取和编译的,也可以说java是静态的语言,如果你想在一个java程序在编译之后的运行时期再去临时编译某个类从而获得实例对象,通常情况下是不能实现的,例如:new

ShewMi的专栏 2908

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

浅谈java代理 静态代理动态代理 JDK动态代理和CGLIB动态代理

浅谈java代理 静态代理动态代理 JDK动态代理和CGLIB动态代理

园区阿祖的博客 1313

java动态代理:jdk动态代理和cglib动态代理

java动态代理

记录学习点滴 3318

深入理解Java JDK动态代理

/ 业务接口// 方法1:无返回值// 方法2:有返回值// 接口实现类(目标对象)@Override@Override适用场景目标类实现接口,需灵活增强方法(如Spring AOP、RPC代理)。最佳实践优先为业务类定义接口,解耦实现与调用。将增强逻辑封装到,保持单一职责。利用保存代理类字节码,辅助调试。局限性无法代理无接口的类,此时需结合CGLIB或其他字节码增强工具。通过本文的深入解析,相信你已掌握JDK动态代理的核心原理与应用技巧。

m0_75126572的博客 1595

java中代理模式 之 jdk动态代理模式

java中代理模式 之 jdk动态代理模式,介绍,原理,代码实现

m0_73892800的博客 1015

java中的动态代理(jdk和Cglib)

拓展性:要是考虑使用角度Cglib无疑是更好的,因为JDK只能代理接口原理:JDK代理是利用反射机制生成匿名类,调用也是通过反射来调用 Cglib是采用字节码技术,通过修改字节码生成子类效率:JDK创建对象效率较高,但执行较慢,Cglib创建对象效率低,但执行较快局限性: Cglib需要额外导入第三方包,而Jdk代理不需要,但JDK局限于代理接口到底用什么相信大家有选择了,如果没特殊需求,就直接JDK得了,有特殊需求不用Cglib,JDK能满足吗?

lonelykkk的博客 1292

Java 动态代理之jdk 动态代理

​ 本身就继承了Proxy 类实现了被代理类实现的接口,因为java是单继承的 ,如果被代理是继承父类而不是实现接口 那便违反了java的单继承规则` public final class $Proxy0 extends Proxy implements Interface { public $Proxy0(InvocationHandler paramInvocationHandler) {\ super(paramInvocationHandler); } Java 动态代理

luojiqiangtyj的博客 303

Java代理之JDK动态代理

 Java代理之JDK动态代理 1 概述在对静态代理的讨论中,可以发现,如果方法比较多的情况下,为每种方法做代理,是一件重复和繁琐的工作。需要有一种机制能够截获方法调用,从而集中处理。这就是将探讨的动态代理。在Java中,动态代理是指代理类的生成发生在程序运行时期,根据被代理类动态生成代理类的字节码文件(class文件),并且装载到运行环境中,像其他的类一样使用,该字节码文件的生存期随

时光烙 3227
上一篇: 使用Spring Boot+MyBatis框架做查询操作
下一篇: SpringBoot 之Actuator
javaQQ群 866865133
博客等级 码龄8年 59粉丝 309原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值