在
昨天的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!
分享到:
相关推荐
### 移动代理系统综述 ...未来的研究将更加注重提高移动代理的安全性、可靠性和性能,并探索更多创新的应用场景。随着技术的进步和标准的逐步完善,移动代理有望成为下一代分布式计算的重要组成部分。
当代理之间存在竞争时,虽然增加了系统复杂性和动态性,但只有当代理们能够在某些方面实现合作时,才能构成真正意义上的多代理系统。例如,在资源分配问题中,尽管代理之间可能因为争夺资源而竞争,但他们仍需合作以...
- **非同步及自律性计算**:移动代理可以在断开连接的情况下继续执行任务,减少了通信成本。 - **动态适应环境**:能够根据执行环境的变化调整自己的行为。 - **异种系统的模型化**:有助于不同操作系统或平台之间的...
在未来的研究中,我们可以继续研究和改进 Squid 代理服务器的性能和安全性,以满足不断增长的网络需求。同时,我们也可以探索其他缓存技术和代理服务器的应用领域。 七、参考文献 [1] Squid 代理服务器官方文档 [2...
【云计算与强耦合网络代理模型】 云计算是一种计算资源共享服务模式,通过互联网提供软件、硬件资源,使得用户能够...未来的研究将继续探索如何进一步优化代理模型和安全算法,以适应不断变化的云计算环境和技术需求。
- **未来工作**:进一步的研究可以探索如何更有效地在线学习其他代理的行为,特别是在更加复杂和动态的环境中。此外,还可以研究如何将这种方法应用于实际的自动化市场场景中,以提高交易效率和公平性。 总之,动态...
### 面向无人机网络的属性代理签名方案 #### 引言 随着无人机技术的不断发展,无人机...未来的研究方向可以进一步探索如何在保证安全性的前提下,优化方案的计算效率和通信效率,以更好地适应无人机网络的实际需求。
《HTTP代理服务器课程设计报告》 ...总结,构建HTTP代理服务器涉及到网络编程、协议解析、并发处理等多个技术领域,通过这一过程,我们可以深入理解互联网通信的核心机制,为未来的网络技术探索打下坚实基础。
未来,我们将继续完善招标代理服务,提升专业能力,强化风险控制,同时探索新的业务模式和技术应用,以适应市场变化,为客户创造更大的价值。在新的一年中,我们将更加注重客户关系的维护,努力提升客户忠诚度,推动...
方案强调了设立总代理的意义在于探索国有通信运营企业的专业化分工,尝试将网络经营权和服务经营权分离,同时以民营机制介入国有电信服务业,以实现互利共赢。指导思想是开源节流,改革进取,强调技术与服务创新,...
【银行治理】 银行治理是金融机构管理的核心,它涉及到银行内部的权力分配、决策机制、风险...因此,政策制定者和银行管理层应重视这三者之间的关系,不断探索和改进银行的治理实践,以适应不断变化的金融市场环境。
永达汽车不仅加大了新能源汽车品牌的代理力度,还积极参与充电设施建设,为客户提供便捷的充电解决方案。此外,公司在共享出行、智能网联等新兴领域进行布局,试图打造全新的商业模式,以适应未来汽车行业的变革。 ...
### 关于跨域移动代理功能和资源查找算法的研究 #### 摘要 本文探讨了跨域移动代理功能和资源查找...未来的研究方向可能包括进一步优化算法以适应更加复杂多变的网络环境,以及探索更多高效的资源管理和调度策略。
强化学习的核心概念和算法,强调了其在构建智能代理中的重要性。强化学习是一种通过与环境互动来优化智能体行为的学习方法,核心目标是最大化累积奖励。文章深入探讨了强化学习的基础要素,如智能体、环境、状态、...
- 探索通信网络管理和运营服务管理的专业化分工,提升运营效率。 - 以民营机制介入国有电信服务业,实现互利共赢的战略创新。 - 通过合作,加速中国联通在广东的业务全面发展,特别是移动通信用户规模的扩大,...
SOFAMesh的主要组件包括SOFAMosn,一个高性能的网络代理,以及控制平面,负责配置管理和数据平面的协调。 在多语言支持的探索过程中,蚂蚁金服面临了几个主要挑战: 1. **基础设施重复投入**:不同的语言层如...
例如,在Pac-Man游戏中,代理需要在继续去已知的食物源(利用)和探索可能的新食物源或路径(探索)之间做出选择。 强化学习问题的描述可以通过游戏得到很好的阐释。以Pac-Man为例,代理的目标是在躲避幽灵的同时吃...
大宗业务主要通过代理商模式进行,虽然牺牲了一部分利润,但确保了现金流的稳定。这种策略降低了销售费用、应收账款的风险,同时通过与百强房企建立战略合作关系,大宗业务实现了快速发展。 其次,金牌厨柜在零售端...