JAVA动态代理的内部实现

VConsole动态加载 // 移动端真机调试工具 vconsole import VConsole from "vconsole"; import Vue from "vue"; // 动态使用VConsole if(process.env.NODE_ENV==='production'){ if(process.env.VUE_APP_BASEURL.includes('test')||process.env.VUE_APP_BASEURL.includes('pre')){ Vue.prototype 阅读详情

JAVA动态代理的内部实现

一 代理设计模式

代理模式为目标对象提供一种代理以控制对实际对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

为了保持行为的一致性,代理类和实际委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。



代理模式类图


常见的代理有:
1) 远程代理(Remote Proxy):对一个位于不同的地址空间对象提供一个局域代表对象,如RMI中的stub。 
2) 虚拟代理(Virtual Proxy):根据需要将一个资源消耗很大或者比较复杂的对象,延迟加载,在真正需要的时候才创建。
3) 保护代理(Protect or Access Proxy):控制对一个对象的访问权限。
4) 智能引用(Smart Reference Proxy):提供比目标对象额外的服务和功能。

通过代理类这一中间层,能够有效控制对实际委托类对象的直接访问,也可以很好地隐藏和保护实际对象,实施不同的控制策略,从而在设计上获得了更大的灵活性。

二 动态代理使用

JAVA动态代理机制以巧妙的方式实现了代理模式的设计理念。

 


动态代理类图


动态代理在代理ProxySubject和RealSubject之间增加了InvocationHandler这一层,这是一种通信间接化,增加了灵 性性,例如可以把这个中间层实现为一个框架Framework,直接通过xml文件等方式来调用RealSubject。

在普通的设计中,我们一般不会使用动态代理。但是在一些框架结构设计中,动态代理非常重要,如RMI,EJB中都使用动态代理。


动态代理具体使用如下:

 

 


三 动态代理内部实现

通过调用Proxy类的newProxyInstance工厂方法,动态地生成了ProxySubject,所有的方法调用都被委派到InvocationHandler的invoke方法,invoke方法通关Method反射执行RealSubject对应的方法.我们可以推测动态代理类ProxySubject肯定实现了Subjedt接口,并包含一个InvocationHandler对象引用,这是从Proxy继承而得到的。当调用接口中的每个方法时。通过反射调用得到对应的Method对象。并调用invoke方法。

我们可以验证我们的推测是否时正确的。通过Proxy类的源代码我们了解类Proxy的getProxyClass方法调用ProxyGenerator的 generateProxyClass方法产生ProxySubject.class的二进制数据:


public static byte[] generateProxyClass(final String name, Class[] interfaces)


我们可以import sun.misc.ProxyGenerator,调用 generateProxyClass方法产生binary data,然后写入文件,最后通过反编译工具来查看内部实现原理,如上面的createProxyClassFile()方法。

反编译后的ProxySubject.java如下,其中无关的代码被删除了。



 

我们可以看到动态代理的内部实现和我们前面的推测相同,并且我们可以实现自己的一个动态代理生成器。如果你想探究ProxyGenerator内部是如何生成class二进制数据,可以参考下面部分的源代码。



 

C语言实现惯性导航初始对准全部核心代码 惯性导航初始对准包括间接粗对准和卡尔曼滤波精对准,其中。为基于卡尔曼滤波的精对准,其中。 阅读详情

相关推荐

分类模型AUC低于0.5?5个常见坑点排查指南(附代码示例)

本文针对分类模型AUC低于0.5的常见问题,提供了5个关键排查点及代码示例。从样本分布失衡、特征与标签脱节到量纲差异、模型初始化和数据泄露,详细解析了可能导致AUC异常的原因,并给出实用的诊断方法和解决方案,帮助开发者快速提升模型性能。

weixin_29190169的博客 239

spring aop动态代理内部方法互相调用

https://www.jianshu.com/p/6534945eb3b5 修改类,不要出现“自调用”的情况:这是Spring文档中推荐的“最佳”方案; 若一定要使用“自调用”,那么this.doSomething2()替换为:((CustomerService) AopContext.currentProxy()).doSomething2();此时需要修改spring的aop配置: <...

nice_hui_的博客 1342

Xilinx HydraMini试玩教程

HydraMini是Xilinx推出的基于Pynq-Z2开发板的自动驾驶开发小车,其有着简单易学、高灵活性、高扩展性、高性能等优良特性,是研究人员和学生进入自动驾驶领域的一个平台。本教程会通过最基础的讲解和步骤带领读者熟悉这个平台的基本开发流程。

qq_25762163的博客 1773

动态代理方法互相调用

当代理对象方法互相调用时,被调用的方法不能代理。 从JDK 分析原因,不用担心,超级简单,cglib复杂一点,不过也就复杂一点点。 目录结构如下 Target.java定义俩方法 package t1.propagation; public interface Target { public void a(); public void b(); } 子类继承方法,并实现互相调用 public class TargetImp implements Target { @Override

qq_44989936的博客 736

告别模糊与偏色:使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战心得

本文详细介绍了如何使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战经验。从调试环境搭建到3A算法优化,再到画质增强模块的深度调参,提供了全面的技术指导和参数建议,帮助工程师解决噪声、色偏和细节模糊等常见问题,显著提升成像质量。

weixin_28729205的博客 452

① Django手把手从零开发个人博客-前言

手把手教你从零开始玩转手把手教你从零开始玩转Django,全面学习并了解django的运行机制、开发全流程及线上部署。Django,全面学习并了解django的运行机制、开发全流程及线上部署。 专栏介绍 本套教程遵循Django的设计思想,开门见山,快速切入主题,拒绝拖沓,在实战中学习每一个知识点,提高学习的趣味性以及个人成就感,并且能快速将所学运用到实际项目中。 将从零手把手带着你一步步完成博客的每一个功能,通过实现博客文章列表页、文章详情页、作者页面等功能来学习和了解django的视图查询模块相关知.

轻编程的博客 513

Spring AOP如何让内部方法调用也发生代理

方法之间的调用直接使用的是原始对象,而非代理对象,因而内部调用不会产生代理public class Waiter { public void greetTo(String name) { System.out.println("greet to :" + name); } public void serveTo(String name) { ...

long798266215的博客 5922

GEE数据融合——Landsat (collection 2,level 2 )4、5、7、8、9长时间序列影像数据融合和视频导出分析

长时间序列影像数据融合是指将Landsat影像数据集合2级2(Level 2)中的4、5、7、8和9这五个卫星的数据进行融合。具体来说,这包括将同一地点的多个卫星影像数据进行处理和整合,以产生一个单一的、具有更高质量的影像产品。在长时间序列影像数据融合中,首先需要对不同卫星的影像数据进行校正,以消除不同卫星之间的光谱差异、辐射度问题和几何纠正误差等。然后,通过使用融合算法,将多个卫星的影像数据进行组合,以生成一张全新的、高质量的合成影像。

此星光明博客 1733

动态代理同一个类中方法相互调用特点

动态代理一个方法调用同一个类的另一个方法

底层码农 1491

分立器件---电感介绍(7000字)

电感基础整理

HW-BASE的博客 2350

8、硬件工程师笔试面试知识器件篇——二极管(2025版本)

当二极管正向偏置时(阳极相对于阴极为正电压),PN结内部的电场减小,允许电子和空穴复合,形成电流。而当二极管反向偏置时,PN结的电场增强,阻止电流通过。在接触区域,P型半导体中的空穴和N型半导体中的自由电子会相互扩散和复合,形成一个没有自由载流子的耗尽区。在设计电子电路时,平衡二极管的正向电压降(Vf)和最大电流(I)是一个重要的考虑因素,因为这两者直接影响电路的性能和效率。通过这些步骤,可以确保在设计电子电路时选择的二极管能够安全地处理预期的最大正向电流和最大反向电压,从而提高电路的可靠性和安全性。

XU157303764的博客 3500

彻底理解JAVA动态代理

代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问。 代理模式的结构如下图所示。 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念。 代理模式示例代码 public interface Subject { public void doSomething(); } public class RealSubje...

weixin_30460489的博客 780

区块链技术概述:从比特币到Web3.0

区块链技术正重塑数字世界的信任机制。本文系统梳理了区块链的发展路径:从比特币的PoW共识和UTXO模型,到以太坊的智能合约和账户体系,直至Web3.0的去中心化互联网愿景。文章详细解析了区块链的核心特性(去中心化、不可篡改等)和数据结构,通过流程图展示了比特币交易生命周期和智能合约执行流程,并对比了Web2.0与Web3.0的关键差异。最后,用Python代码实现了包含区块类、交易处理和挖矿机制的简易区块链系统,为理解区块链底层原理提供了实践参考。

闲人编程的博客 455

JAVA动态代理内部实现

JAVA动态代理内部实现一 代理设计模式代理模式为目标对象提供一种代理以控制对实际对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。为了保持行为的一致性,代理类和实际委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。 代理模式

shoyonder的专栏 1453

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java动态代理的内部实现

hadoop中的RPC是个很重要的机制,datanode与namenode之间的通信通过RPC方式在实现,其中java的动态代理与反射等相关机制在里面扮演了重要的角色。下午花了点时间,弄了个简单的代理实例,按照个人的理解来粗讲下的proxy的内部实现。   一.相关类及其方法: java.lang.reflect.Proxy:  Proxy 提供用于创建动态代理类和实例的静态方法. new

983

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JAVA接口、内部类、代理学习demo代码

1、主测试类 package gensoku; import java.lang.reflect.*; import java.util.*; public class hello { public static void main(String[] args) { try { System.out.println("Hello"); youkai uuz = new youkai("uuz", "dead sakuya", "All die, none can escape");

weixin_44115360的博客 214

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java动态代理Proxy 内部机制

重要的类是Proxy.  首先要理解反射机制! Spring的AOP就是用的动态代理机制。 import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;

我是传奇 1945

java动态代理实现与原理详细分析

原文地址 https://www.cnblogs.com/gonjan-blog/p/6685611.html 关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式–代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。 一、代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理.

西湖边上的小松鼠 3245

动态代理使用以及Proxy的内部实现

java动态代理机制以巧妙的方式实现了代理模式的设计理念。 代理模式示例代码 public interface Subject { public void doSomething(); } public class RealSubject implements Subject { public void doSomething()

mid120的博客 1074

java篇26-Java匿名内部类、invoke方法、动态代理

Proxy.newProxyInstance()方法的第一个参数了解书写形式即可,第二个参数为执行被代理的接口的字节码,第三个参数的作用是对被代理的接口的方法增加功能,注意代理类是可以对接口中所有的方法增加功能,当通过代理类对象调用被代理类的方法时,该方法就传给invoke()方法里的method,代理类对象调用被代理类的方法时的参数传给args。一般是通过“自定义的代理类”来管理“指定类”(被代理类)的方法的执行,这里的“管理方法的执行”实质是在方法执行前添加一些代码,表现为方法执行的功能增加了。

qq_51476492的博客 1712

Java 动态代理的底层原理

文章目录1. 动态代理使用2. 动态代理原理 1. 动态代理使用 2. 动态代理原理

谈谈1974 1689

动态代理源码分析,实现自己的动态代理

什么是代理 增强一个对象的功能 买火车票,app就是一个代理,他代理了火车站,小区当中的代售窗口 java当中如何实现代理 java实现的代理的两种办法 代理的名词 代理对象 增强后的对象 目标对象 被增强的对象 他们不是绝对的,会根据情况发生变化 静态代理 继承 代理对象继承目标对象,重写需要增强的方法; 缺点:会代理类过多,非常复杂 聚合 目标对象和代理对象实现同一...

Leon_Jinhai_Sun的博客 253

java 动态代理高级

从JDK1.3以后,java引入动态代理机制,即对目标对象的方法调用是通过代理对象来完成的,java的动态代理只能针对接口进行动态代理,即要实现动态代理的类必须实现接口,CGLIB提供了针对类的动态代理功能。JDK动态代理的例子如下: //代理接口 package com.proxy.test; interface IProxy{ public void hello(Strin

Tony Chen的专栏 3578

Java中的动态代理使用

代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问。 代理模式的结构如下图所示。 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念。 代理模式示例代码 public interface Subject { public void doSomething(); } public class RealSubject implements S

越程的专栏 503
下一篇: 代码质量-变量的作用域最小化原则与就近原则
飞天金刚
博客等级 码龄17年 35粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值