继续探索动态代理

        在昨天的Post中,三言两语把动态代理(Dynamic Proxy)大致介绍了一下并给出了一个例子,我想大家应该和我一样对Dynamic Proxy有一定认识了吧。然而Dynamic Proxy这个宝藏的底蕴是深厚的,三言两语又怎能发掘到精华呢?于是,偶带着很多疑问,对Dynamic Proxy来一次更全面的探索。
        在Dynamic Proxy中,最有意思的应该是Proxy创建的过程了。我们可以通过调用Proxy.newProxyInstance这个方法来创建一个Proxy的实例,然而这个Proxy的实例却可以被Cast成所绑定的interface的型别。为什么Proxy的实例可以成功地被Cast呢?在没有去考究之前,先让偶天马行空一番。Proxy中包含了一个特别的Inner Class,它的定义是这样的 public Class InProxy implements *。 而这个星号在Proxy创建的时候被具体的interface list所替代,这样InProxy的定义才完整,才能够基于这样的定义创建InProxy的实例。这跟Python中动态创建Class的模板有着几分相似啊!天马行空完了,不管对不对,玩玩想象力倒也不错。为了找到正确的答案,我于是打开Proxy这个Class的source code看个究竟。   

        从代码中,我们可以发现newProxyInstance方法等价于三个方法的调用:
None.gif    newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)  
None.gif
== Class proxyClass =  Proxy.getProxyClass(loader, interfaces);
    Constructor cons 
= proxyClass.getConstructor(new Class[] { InvocationHandler.class } );
    cons.newInstance(
new Object[] { h } );
None.gif

在三个方法调用中,后面两个是类Class中十分常见的方法,并没有什么特别的,关注的重点落在了getProxy方法。在getProxy方法中,第一步是检查参数interfaces的是否invalid,如果这一组interface都是valid,将创建一个字符串以存储这些interface的名称。使用字符串而非Collection来存储interface的名称是出于性能以及弱引用(不是很明白这里为什么需要用到弱引用)的考虑;第二步是在一个WeakHashMap中以ClassLoader作为Key去查找另外一个Map,而这个Map则缓存着已经创建的Proxy Class,如果在这个Map中找到了需要的Proxy Class则返回,否则通过ProxyGenerator.generateProxyClass方法以及一个名为defineClass0的native方法创建Proxy Class,而这两个方法我都无从寻找它们的source code。Oh,my God!
        Anyway,这一阵瞎摸索还是让我知道了,Proxy Class之所以能够被Cast成所绑定的interface的型别,靠的就是这两个方法了。尽管没有办法到这两个方法的内部看个究竟多少让我有些失落,但是,这样把source code阅读了一番,倒给我提出了更多的问题。噢,又有好玩的东西可以去发掘了,so great!
       
Spring AOP源码深度解析:从动态代理原理到实战应用 面向切面编程(AOP)是一种重要的编程范式,其核心思想是将横切关注点(如日志、事务、权限校验)从业务逻辑中分离出来,实现代码的模块化和解耦。其实现原理主要基于动态代理技术,通过在运行时为目标对象创建代理,将通知逻辑织入到方法调用链中。这种机制为Java应用带来了显著的工程价值,能够有效减少代码重复、提升可维护性,并统一处理系统级的非功能需求。在Spring框架中,AOP被广泛应用于事务管理、安全控制、性能监控和日志记录等典型场景。本文以权限校验为例,深入剖析了Spring AOP中JDK动态代理与CGLIB 阅读详情

相关推荐

SAP-QM-质检操作

SAP-QM-质检操作

yanzibing99的博客 8158

docker run:–security-opt seccomp=unconfined选项解析 (安全计算模式Secure Computing Mode,实现系统调用过滤,禁用或允许某些系统调用)

Seccomp,即安全计算模式,是 Linux 内核的一部分,用于限制进程可以使用的系统调用2。通过禁止或限制对某些系统调用的访问,Seccomp 可以有效减少攻击者能够利用的攻击面。Docker 在默认情况下启用了 Seccomp,并提供了一个默认的配置文件,该文件白名单了大约300个系统调用,其他的则被禁止。这意味着在 Docker 容器中运行的进程只能访问这些已经过滤的系统调用。总的来说,Docker 的选项是一个强大的工具,可以提供更大的灵活性。

Dontla的博客 9252

【3D计算机视觉】从PointNet到PointNet++理论及pytorch代码

从PointNet到PointNet++理论及代码详解1. 点云是什么1.1 三维数据的表现形式1.2 为什么使用点云1.3 点云上以往的相关工作2. PointNet2.1 基于点云的置换不变性2.1.1 由对称函数到PointNet(vanilla)2.1.2 理论证明2.2 基于点云的旋转不变性2.3 网络总体结构2.4 实验结果和网络的鲁棒性2.5 代码解析3. PointNet++3.1...

小执着的博客 8万+

探索Cglib:解析动态代理的神奇之处

CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO(Persistent Object 持久化对象)字节码的动态生成。CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如Spring AOP为他们提供方法的interception(拦截)。

Apple_Boy的博客 1188

TC397 EB配置ADC软件触发:从零实现周期采样与中断处理

本文详细介绍了如何在Infineon AURIX TC397芯片上使用EB Tresos工具配置ADC软件触发,实现周期采样与中断处理。通过硬件连接、EB模块配置、代码初始化及数据处理的全流程解析,帮助开发者快速掌握ADC软件触发技术,提升嵌入式系统开发效率。

root9的博客 224

CIFAR-100模型性能对比:Top1与Top5错误率深度解析

本文深度解析了CIFAR-100数据集上Top1与Top5错误率的核心意义与差异。通过对比MobileNet、ResNet、DenseNet等主流模型的性能数据,揭示了模型架构、训练策略及数据集特性如何共同影响这两个关键指标,并为不同应用场景下的模型选择提供了实战指南。

weixin_28224217的博客 326

探索Java动态代理的奥秘:JDK vs CGLIB

动态代理是一种在 运行时动态生成代理类的技术,无需手动编写代理类代码。它通过拦截目标方法的调用,实现对核心逻辑的 无侵入式增强(如日志、事务、权限控制等)。

qq_17153885的博客 957

【遥感物候】植被物候与气候(气温和降水)条件的空间相关性分析

植被生长与气候的关系最为密切,通过计算植被各个生长季参数和气温、降水之间的相关系数可以分析生长季参数的变化与气温、降水之间的关系的程度。本文计算30年的植被物候参数和气候数据之间的相关性,最终效果如下: 一、相关性分析原理 植被生长季及其变化是其生长环境中多个影响因子综合作用的耦合过程,其中气候是最重要、最活跃的环境因子。通过计算各个生长季参数和气温、降水之间的相关系数...

智慧空间实验室 8246

深入了解jdk动态代理和cglib动态代理

深入了解jdk动态代理和cglib动态代理 核心总结全在图里面,这是针对上一篇博客进一步加深动态代理知识,看不懂先参考上一篇文章 jdk动态代理 cglib动态代理 主要是生成的三个文件(注意,并不是同一时间生成的) 后续将会继续探索FastClass机制为什么比反射快 ...

qq_38526245的博客 218

把 ABAP ALE Change Pointers 讲透:从 CDHDR/CDPOS 到 BDCP2,再到 RBDMIDOC 的自动分发链路

摘要:SAP ALE Change Pointers机制在系统集成中实现业务变更与数据分发的解耦。它记录业务对象变更(如SAP主数据修改),但不立即发送,而是由后续分发逻辑决定发送时机和方式。该机制包含两层:Change Documents记录审计级变更明细,Change Pointers标记需分发的关键变更。配置核心包括全局开关、消息类型激活和字段选择。典型应用如零售价格条件变更自动推送至POS系统,通过BDCP2表存储待处理队列,由RBDMIDOC程序定时评估生成IDoc。运维需关注定期清理和性能优化,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 194

【YOLOv8改进-损失函数】 YOLOv8自带损失函数CIoU / DIoU / GIoU 详解,以及如何切换损失函数

在介绍YOLOv8中的各种Iou之前,我们先来了解了解目标检测中的损失函数。目标检测模型通常包含两类损失函数:类别损失(分类)和位置损失(回归)。这两类损失函数用于检测模型的最后一部分,根据模型的输出(类别和位置)以及实际标注框(类别和位置),分别计算类别损失和位置损失。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 5184

【潜意识Java】类加载机制、反射与动态代理

家人们,今天继续带大家深入探索 Java 编程世界里那些既复杂又强大的特性,这次我们聚焦于类加载机制、反射以及动态代理。理解这些内容,对于编写高效、灵活且可扩展的 Java 程序至关重要,同时也是迈向 Java 高级开发的关键一步,下面就听我细细道来。

潜意识Java的博客 783

基于Matlab的深度学习OFDM系统信号检测

在接收端,我们首先去除循环前缀,然后对接收到的信号进行FFT变换和QAM解调。在通信系统中,正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)是一种常用的调制技术,它可以将高速数据流分成若干个低速子载波进行传输,提高了信道利用率和抗干扰性能。接下来,我们使用训练好的神经网络对QAM调制后的数据进行检测,得到估计的FFT变换结果。深度学习方法可以通过大量的训练数据来学习信号的特征,并具有一定的适应能力,在某些情况下可能能够获得更好的检测性能。

2301_79325657的博客 293

java 动态代理 和动态编程

概述 代理分两种技术,一种是jdk代理(机制就是反射,只对接口操作),一种就是字节码操作技术。前者不能算技术,后者算是新的技术。未来将有大的动作或者较为广泛的应用和变革,它可以实现代码自我的编码(人工智能,代码智能)。 什么是动态编程?动态编程解决什么问题?Java中如何使用?什么原理?如何改进?(需要我们一起探索,由于自己也是比较菜,一般深入不到这个程度)。 什么是动态编程 动态编程是...

qq_39158142的博客 1014

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

Android面试:JDK动态代理的原理(1)

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的Android开发中高级必知必会核心笔记,共计2968页PDF、58w字,囊括Android开发648个知识点,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2401_84121702的博客 609

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

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

Android面试:JDK动态代理的原理(1),十年Android编程开发生涯

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。下面是部分资料截图,诚意满满:特别适合有开发经验的Android程序员们学习。不论遇到什么困难,都不应该成为我们放弃的理由!如果你看到了这里,觉得文章写得不错就给个赞呗?《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》

2401_84152140的博客 1020

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

动态代理(二)—— CGLIB代理原理

前篇文章动态代理(一)——JDK中的动态代理中详细介绍了JDK动态代理的Demo实现,api介绍,原理详解。这篇文章继续讨论Java中的动态代理,并提及了Java中动态代理的几种实现方式。这里继续介绍CGLIB代理方式。 CGLIB动态代理在AOP、RPC中都有所使用,是Java体系中至关重要的一块内容。本篇文章的主要目标: 掌握使用CGLIB生成代理类 深入理解CGLIB的代理原理 从以上目...

weixin_34269583的博客 213

动态代理(二)

这是动态原理的第二篇,这里要讲述的是Cglib的东东。接下来,进正题。 参考文章:http://www.cnblogs.com/cruze/p/3843996.html 一、Cglib CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CG...

weixin_34348111的博客 78

【Mybatis源码探索】 --- Mybatis查询过程核心源码解读 --- mapper调用方式

文章目录1 源码入口2 getMapper(...)方法 1 源码入口 本篇文章的源码入口如下(可参考文章《【Mybatis源码探索】 — 开篇 • 搭建一个最简单的Mybatis框架》): /*** * mybatis的方式 */ @Test public void quickStart2() { // 2.获取sqlSession SqlSession sqlSessio...

nrsc 3114
上一篇: 三言两语话动态代理
下一篇: IronPython编辑器 —— FantasyPython雏形的雏形
iteye_9173
博客等级 码龄8年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值