A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈小红 中级黑马   /  2012-10-30 15:23  /  1403 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看java高新技术视频,对于为什么要使用动态代理去建框架还是有点晕,希望高手能用自己的话指点一下,以便加深对动态代理的理解。

评分

参与人数 1技术分 +1 收起 理由
尤圣回 + 1

查看全部评分

1 个回复

倒序浏览
以前一位高手的说法:
动态代理,掌握原理之后能做什么,我之前研究过一个东西,在以前我们定义一个对象,这个对象的行为就固定了,如果需要进行限制这个对象的某些行为,我们可能需要定义一堆的字段或者其他手段来控制,这是很不方便的,代码也显得更复杂,至少我自己写了之后发现很混乱,并且如果是运行时需要动态给某些对象删除或者增加功能(函数/方法)的话,写死的代码是实现不了的。

假设一个对象person,他有吃饭,有睡觉,有上厕所的功能,但是植物人不会吃饭吧?加班的可能几天不睡觉吧?便秘的可能不上厕所吧?就还仅是3个功能,如果多了呢?几十个,如果这些功能都可以随便组合,都不是必须具备的功能,那么你的逻辑代码需要多少,具体的功能组合形成的子类需要多少?我估计很多人到这就崩溃了。。。

如果拿代理来做,我们需要的是什么?接口,每个功能一个接口,这些接口被人的代理类实现(或者是适配器产生的具体实现类组合形成的策略模式),并会返回一个具备这些功能的person对象,我们仅需检查他具备不具备这些功能就可以,而不是还要检查一些额外的条件,而在某些功能失效,或者某些功能被加入的情况下,我们仅需要更换一下代理就行。这个可能不太好理解点,通俗来说就是,一个人没有胳膊,和有胳膊瘫痪的区别是不一样的。

这里频繁生成的各种功能组合的代理类的字节码是会存在于内存中,可能所有组合你都试过之后,一些不常用的组合会有内存溢出的风险,这时候就需要用到类加载机制和字节码技术,来把这些类的字节码文件像对象重用一样的进行重复利用,以避免大量的代理类造成内存溢出。

评分

参与人数 1技术分 +1 收起 理由
尤圣回 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马