`

继续探索动态代理

阅读更多
        在昨天的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方法等价于三个方法的调用:
   newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)  
== Class proxyClass = Proxy.getProxyClass(loader, interfaces);
    Constructor cons 
= proxyClass.getConstructor(new Class[] { InvocationHandler.class });
    cons.newInstance(
new Object[] { h });

在三个方法调用中,后面两个是类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!
       
分享到:
评论

相关推荐

    代理系统设计 Multi intellgent agent system design

    当代理之间存在竞争时,虽然增加了系统复杂性和动态性,但只有当代理们能够在某些方面实现合作时,才能构成真正意义上的多代理系统。例如,在资源分配问题中,尽管代理之间可能因为争夺资源而竞争,但他们仍需合作以...

    移动代理安全性的探讨

    - **非同步及自律性计算**:移动代理可以在断开连接的情况下继续执行任务,减少了通信成本。 - **动态适应环境**:能够根据执行环境的变化调整自己的行为。 - **异种系统的模型化**:有助于不同操作系统或平台之间的...

    一种具有容错功能的移动代理间通信技术.pdf

    相比之下,本文提出的基于双向指针链的通信算法,能够适应代理动态位置变化的需求,提供了更为稳定的通信保障。这不仅提高了通信的可靠性和效率,也减少了因代理位置变动导致的通信延迟和失败。 文章还探讨了该通信...

    毕业设计(论文)-基于Linux的Squid代理服务器的架设.doc

    在未来的研究中,我们可以继续研究和改进 Squid 代理服务器的性能和安全性,以满足不断增长的网络需求。同时,我们也可以探索其他缓存技术和代理服务器的应用领域。 七、参考文献 [1] Squid 代理服务器官方文档 [2...

    强耦合代理模型下的云安全分析算法

    【云计算与强耦合网络代理模型】 云计算是一种计算资源共享服务模式,通过互联网提供软件、硬件资源,使得用户能够...未来的研究将继续探索如何进一步优化代理模型和安全算法,以适应不断变化的云计算环境和技术需求。

    on-line learning about other agents.pdf

    - **未来工作**:进一步的研究可以探索如何更有效地在线学习其他代理的行为,特别是在更加复杂和动态的环境中。此外,还可以研究如何将这种方法应用于实际的自动化市场场景中,以提高交易效率和公平性。 总之,动态...

    "互联网+"下的代理记账之变[会计实务优质文档].doc

    随着“互联网+”战略的不断深入,代理记账行业这一传统领域也在经历着翻天覆地的变革。...未来,代理记账机构将继续以客户为中心,依托互联网技术,为小微企业提供更加专业、高效、贴心的会计服务。

    面向无人机网络的属性代理签名方案.docx

    ### 面向无人机网络的属性代理签名方案 #### 引言 随着无人机技术的不断发展,无人机...未来的研究方向可以进一步探索如何在保证安全性的前提下,优化方案的计算效率和通信效率,以更好地适应无人机网络的实际需求。

    http代理服务器课程设计报告

    《HTTP代理服务器课程设计报告》 ...总结,构建HTTP代理服务器涉及到网络编程、协议解析、并发处理等多个技术领域,通过这一过程,我们可以深入理解互联网通信的核心机制,为未来的网络技术探索打下坚实基础。

    招标代理年终总结.doc

    未来,我们将继续完善招标代理服务,提升专业能力,强化风险控制,同时探索新的业务模式和技术应用,以适应市场变化,为客户创造更大的价值。在新的一年中,我们将更加注重客户关系的维护,努力提升客户忠诚度,推动...

    绿电交易模式下商业区电动汽车代理商定价策略及EV充电管理.pdf

    在绿色能源愈发受到重视的今天,电动汽车(EV)逐渐成为城市交通的新能源主力,而如何管理和...未来的研究与实践应当继续深化对这一模式的理解,不断探索和完善相关的技术和管理策略,以应对日益严峻的能源和环境挑战。

    银行治理、代理成本与银行机构风险控制概述.doc

    【银行治理】 银行治理是金融机构管理的核心,它涉及到银行内部的权力分配、决策机制、风险...因此,政策制定者和银行管理层应重视这三者之间的关系,不断探索和改进银行的治理实践,以适应不断变化的金融市场环境。

    汽车行业点评:永达汽车:经营能力提升、探索新能源汽车商业模式.zip

    永达汽车不仅加大了新能源汽车品牌的代理力度,还积极参与充电设施建设,为客户提供便捷的充电解决方案。此外,公司在共享出行、智能网联等新兴领域进行布局,试图打造全新的商业模式,以适应未来汽车行业的变革。 ...

    关于跨域移动代理功能和资源查找算法的研究.pdf 论文

    ### 关于跨域移动代理功能和资源查找算法的研究 #### 摘要 本文探讨了跨域移动代理功能和资源查找...未来的研究方向可能包括进一步优化算法以适应更加复杂多变的网络环境,以及探索更多高效的资源管理和调度策略。

    强化学习教程:构建智能代理的核心概念.md

    强化学习的核心概念和算法,强调了其在构建智能代理中的重要性。强化学习是一种通过与环境互动来优化智能体行为的学习方法,核心目标是最大化累积奖励。文章深入探讨了强化学习的基础要素,如智能体、环境、状态、...

    总代理实施方案(初稿).doc

    - 探索通信网络管理和运营服务管理的专业化分工,提升运营效率。 - 以民营机制介入国有电信服务业,实现互利共赢的战略创新。 - 通过合作,加速中国联通在广东的业务全面发展,特别是移动通信用户规模的扩大,...

Global site tag (gtag.js) - Google Analytics