Java动态代理

什么是 Java 中的动态代理? 动态代理是 Java 提供的一种机制,它允许在运行时动态创建代理类和对象,而无需手动编写代理类的代码。代理对象可以在不改变目标对象代码的情况下,为目标对象扩展功能。 阅读详情

本文目录

1 Java动态代理

2 使用示例

3 原理图解

4 实际应用


1 Java动态代理

Java提供了动态代理技术,允许开发者在运行期间创建接口的代理实例。

Java动态代理主要涉及 java.lang.reflect 包中的两个类:InvocationHandler 和 Proxy

Proxy 利用 InvocationHandler 动态创建一个符合指定接口的代理实例,用于代理某个实现了指定接口的目标类的实例。

2 使用示例

/**
 * 定义接口
 */
public interface Calculator {

  int calculate(int a, int b);
}
/**
 * 定义目标类:定义了具体的接口方法逻辑
 */
public class Machine implements Calculator {

  @Override
  public int calculate(int a, int b) {
    return a + b;
  }
}
/**
 * 定义Handler类:定义代理逻辑
 */
public class Handler implements InvocationHandler {

  // 目标实例
  private Object target;

  public Handler(Object target) {
    this.target = target;
  }

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    // 转调 目标实例 相应的方法
    return method.invoke(args);
  }
}
public static void main(String[] args) {

  // 创建目标类的实例
  Calculator target = new Machine();

  // 创建Handler实例:作为 代理实例 和 目标实例 的媒介(桥梁)
  Handler handler = new Handler(target);  // 传入 目标实例

  // 创建代理实例
  Calculator proxy = (Calculator) Proxy.newProxyInstance(
      target.getClass().getClassLoader(),
      target.getClass().getInterfaces(),  // 需要代理的接口列表(创建相应接口方法)
      handler);  // 传入 Handler实例:调用代理方法 将转调 handler.invoke 方法

  /*
   * 调用代理方法,转调 handler.invoke 方法;
   * 在 invoke 方法中,通过反射,调用目标实例的 calculate 方法。
   */
  proxy.calculate(1, 2);
}

3 原理图解

图例说明:

Calculator 表示接口类

target 表示实现了 Calculator 接口的类(目标类)的实例

proxy 表示代理了目标类接口的代理实例

handler 表示实现了 InvocationHandler 接口的类的实例

代理过程:

proxy 相当于创建了一个目标类接口的模板,target 则是实现了接口方法的目标类的实例。

(1)当通过 proxy代理实例 调用某接口方法时,内部实际调用的是 handler 的 invoke 方法;

(2)在 handler 的 invoke 方法中,通过反射机制,调用了目标实例 target 的相应方法,从而完成代理功能;

4 实际应用

由于 invoke 方法的逻辑是由开发者定义,因此,可以在其中添加一些“额外”的逻辑。

例如:为 target.calculate 方法添加一些前置逻辑和后置逻辑,用来打印一些日志内容,则可以重新定义Handler逻辑。

/**
 * 定义Handler类:定义代理逻辑
 */
public class Handler implements InvocationHandler {

  // 目标实例
  private Object target;

  public Handler(Object target) {
    this.target = target;
  }

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    before(proxy, method, args);
    Object result = method.invoke(args);  // 转调 目标实例 相应的方法
    after(proxy, method, args, result);
    return result;
  }

  /**
   * 前置操作
   */
  private void before(Object proxy, Method method, Object[] args) {
    // 记录计算参数
    log.info("Calculate Param: {}", args);
  }

  /**
   * 后置操作
   */
  private void after(Object proxy, Method method, Object[] args, Object result) {
    // 记录计算结果
    log.info("Result: {}", result);
  }
}

片上眼图(Eye-opening monitor) 当它们值不同的时候error counter +1,通过统计RX到的码元个数、error counter,可以获得offset sampler上下左右不停的调整位置时的一个误码率(BER),通过这个误码率去描绘出眼图。如上图所示,eye-scan RX端 offset sampler独立且并行的和使用CDR sample的采样电路一起跑,offset-sampler可以任意调整水平(time)和垂直(voltage)方向的偏移(如下图所示),在一个UI内产生一个全新的sample点。 阅读详情

相关推荐

【向量数据库】Milvus向量数据库 ① 从入门到实战

Milvus是专为海量高维向量设计的开源数据库,支持AI搜索、图像识别、推荐系统等场景。相比传统关系型数据库(如PostgreSQL),它更高效处理语义检索、非结构化数据存储,可毫秒级响应亿级向量查询。单机场景下,推荐配置8GB内存/32GB硬盘,支持FAISS/HNSW等索引算法,支持GPU加速。本文涵盖优快云专属部署教程(CentOS脚本/配置调优),提供避坑指南与扩展资源,并对比分析与传统数据库差异。适合算法工程师、AI开发人员快速上手,附官方下载与性能测试技巧,手把手教你搭建高效向量检索系统!

xiezhiyi007的专栏 1588

Java类和对象系列——前置知识:方法

JavaSE基础语法——方法

m0_69438595的博客 328

Zephyr 开发必备技能:一文搞懂 west manifest

本文深入解析Zephyr项目的westmanifest工具与Manifest文件管理,从基础概念到高级应用。文章首先介绍westmanifest作为Zephyr模块化架构的核心工具,负责管理west.yml文件中的模块信息、Git地址及版本控制。随后详细讲解Manifest文件的基本结构、字段含义,以及westmanifest子命令的使用方法,包括查看内容、冻结版本、验证文件等操作。文章还探讨了Manifest的导入继承机制和在团队协作中的版本管理策略,并给出常见问题排查技巧。最后强调Manifest文件作

hemoparrot的专栏 1257

Java中的动态代理

Java中的动态代理

qingfengmax的博客 5625

避坑指南:群晖DSM 7.X挂载NTFS硬盘,为什么你的SATA口不行?从原理到实战一次讲清

本文深入解析群晖DSM 7.X系统挂载NTFS硬盘的底层原理与实战排查方法,揭示SATA接口权限配置的关键参数(如esataportcfg和internalportcfg),并提供安全修改端口配置的详细步骤。针对不同型号群晖NAS的配置差异,给出替代方案与常见故障排查技巧,帮助用户解决NTFS硬盘挂载问题。

weixin_26757925的博客 257

超大规模AI集群跨数据中心互联:Scale-Across技术实现与部署实践

分布式系统通过将计算任务分散到多个节点协同执行,实现算力的横向扩展。其核心原理在于网络通信、数据同步和资源调度机制的技术协同。在AI基础设施领域,分布式架构能有效突破单数据中心算力瓶颈,支撑万亿参数大模型训练。特别是面对长距离传输时延和带宽稳定性挑战,需要采用RDMA、确定性网络等关键技术。Scale-Across作为分布式系统的高级形态,通过跨地域多数据中心互联,构建逻辑统一的AI算力池,为超大规模AI训练和全球推理服务提供核心支撑。本文聚焦AI集群跨数据中心互联的技术路径,涵盖全栈优化、网络自治等实践方

chouxuyi9789的博客 400

【Java】调用代理对象的原始方法

文章目录一. 说明二. 原始类三. 系统启动时生成代理对象四. 代理工具类五. 测试 一. 说明 Java Spring中使用AOP可以很方便的生成代理对象,从而添加自定义逻辑。 本文介绍如何调用代理对象的原始方法,而非代理后的方法 二. 原始类 @Component public class AopTestClass { public void method1() { System.out.println("method1 execute"); } } 三

gossip博客 938

Mplus—随机截距交叉滞后模型(Random Intercepts Cross-Lagged Panel Model, RI-CLPM)

介绍随机截距交叉滞后模型(Random Intercepts Cross-Lagged Panel Model, RI-CLPM)的相关知识,例如模型内容、Mplus语法及对应网址等。

m0_54401011的博客 9535

Java中代理的各种用法

记录一下在java中通过编码方式使用AOP

qq_39701205的博客 402

从CORDIC到DDS:手把手拆解《Verilog传奇》第9章的实战项目(附可跑通的代码)

本文详细解析了如何从CORDIC算法到DDS系统的完整实现过程,基于《Verilog传奇》第9章的实战项目,提供了可运行的Verilog代码。内容涵盖CORDIC算法的硬件实现、DDS系统架构设计、完整系统集成与验证,以及实际部署中的性能调优技巧,适合数字IC和FPGA开发者深入学习。

weixin_42623010的博客 414

《C++等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《C++等级认证CCF-GESP真题解析》🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级认证》C++编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,欢迎订阅!

人生就是一个不断学习的过程 6292

Java方法调用方法

// 简单方法的使用 方法基础入门知识复习 定义格式: public staric void 方法名称(){ 方法体 } 调用格式: 方法名称(); 注意事项: 1.方法定义的先后顺序无所谓。 2.方法定义必须是挨着的,不能在一个方法的内部定义另外一个方法。 3.方法定义之后,自己不会执行的;如果希望执行,一定要进行方法的调用。 // 方法的定义格式 方法其实就是若干语句的功能集合。 方法就好比是一个工厂。 参数就好比是原料;返回值就好比是产出物。 参数(原料):就是进入方法的数据。..

m0_65450106的博客 1132

基于LUT表对鱼眼图像进行畸变校正

当然也可以进行图像的畸变校正操作,已知相机的焦距为fx/fy,光心为cx/cy,像素大小为p(单位mm/pixel)对于畸变校正结果图中像素点(u,v),其对应的原图中的像素坐标(u',v')的计算流程描述如下。1)假设无畸变相机成像模型的焦距和光心与原相机相同,计算得到无畸变相机成像模型中归一化平面坐标(X,Y,Z),其中X=(u-cx)/fx,Y=(v-cy)/fy,Z=1。这里x'/y'的单位为像素。

On my way 639

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

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

曹举的个人博客 2万+

visio安装包

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java动态代理

前段时间去学习了一下RPC原理,其中提到了动态代理。特意去学习了一下,为了防止以后忘记,写下这篇博客做个记录,有不对的地方欢迎指正。 java中的常见的动态代理如Spring AOP。关于动态代理首先需要了解代理模式,根据代理类的创建时间又可以分为静态代理和动态代理。 1、代理模式 代理模式是常见的设计模式之一,Java我们通常通过new一个对象然后调用其对应的方法来访问我们需要的服务。代理模式则...

飞!!!的博客 5万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java动态代理分析

Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地制定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分配到委托对象上反射执行,配置执行过程中,开发人员还可以进行修改代理设计模式代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息、过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

小楼一夜听春雨 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java动态代理和cglib动态代理

Java 动态代理和Cglib动态代理

leon709的专栏 1万+

【Java】动态代理技术

静态代理:在编译期确定代理类,即我们需要手动编写代理类。在这种情况下,代理类与目标类需要实现相同的接口。虽然静态代理能够增强方法,但它不够灵活,因为每次新增接口或方法都需要编写新的代理类。动态代理:在运行时动态创建代理类。Java动态代理主要基于接口进行代理,使用类和接口。动态代理通过反射机制实现,不需要手动编写代理类,能够动态地为接口生成代理类。// 定义用户服务接口// 实现接口的具体类@OverrideSystem.out.println("添加用户: " + name);

u013675821的博客 2919

Java 之动态代理详解

动态代理就像是一位神奇的魔术师,它能悄无声息地在你的代码运行时,为你的对象添加各种功能,而这一切,你不需要修改任何已有的代码!

weixin_64178283的博客 1706

JAVA动态代理

动态代理是Java实现AOP的核心技术,通过运行时生成代理对象解耦业务逻辑与非功能性需求。JDK动态代理适用于接口代理,CGLIB适用于无接口的类代理。实际开发中,优先选择JDK动态代理;若目标类无接口,则使用CGLIB。

2401_89221445的博客 1081

java动态代理详解

目前java动态代理的实现分为两种 1.基于JDK的动态代理 2.基于CGILB的动态代理 在业务中使用动态代理,一般是为了给需要实现的方法添加预处理或者添加后续操作,但是不干预实现类的正常业务,把一些基本业务和主要的业务逻辑分离。我们一般所熟知的Spring的AOP原理就是基于动态代理实现的。 1.基于JDK的动态代理 基于JDK的动态代理就需要知道两个类:1.InvocationHa...

julyone的博客 7万+

Java的动态代理

Java动态代理是Java提供的一种代理机制,允许在运行时动态生成代理类并为接口创建代理对象[@1@][@3@]。这种代理类能够拦截接口方法的调用,并在调用过程中添加自定义逻辑。Java的动态代理提供了一种灵活的方式来创建代理对象,并且可以在不修改原有代码的基础上扩展或改变行为。虽然JDK原生支持的动态代理只能对接口进行代理,但结合CGLIB等第三方库,我们可以构建出更加健壮和灵活的应用程序架构。无论是开发新的应用还是优化现有系统,理解并掌握动态代理的概念和技术都是非常有价值的。

kfepiza的博客 1259

java学习——详解Java 动态代理

上面我们提到 JDK 动态代理是基于接口的代理,而 CGLIB 动态代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 ,也就是说 CGLIB 动态代理采用类继承 -> 方法重写的方式进行的,下面我们先来看一下 CGLIB 动态代理的结构。测试类主要涉及 Enhancer 的使用,Enhancer 是一个非常重要的类,它允许为非接口类型创建一个 Java 代理,Enhancer 动态的创建给定类的子类并且拦截代理类的所有的方法,和 JDK 动态代理不一样的是不管是接口还是类它都能正常工作。

a25847a的博客 1298
上一篇: Spring Boot 学习笔记:MongoTemplate 移除 _class 字段
下一篇: 异或(^)的性质与应用
崔显龙
博客等级 码龄15年 95粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值