以前一位高手的说法:
动态代理,掌握原理之后能做什么,我之前研究过一个东西,在以前我们定义一个对象,这个对象的行为就固定了,如果需要进行限制这个对象的某些行为,我们可能需要定义一堆的字段或者其他手段来控制,这是很不方便的,代码也显得更复杂,至少我自己写了之后发现很混乱,并且如果是运行时需要动态给某些对象删除或者增加功能(函数/方法)的话,写死的代码是实现不了的。
假设一个对象person,他有吃饭,有睡觉,有上厕所的功能,但是植物人不会吃饭吧?加班的可能几天不睡觉吧?便秘的可能不上厕所吧?就还仅是3个功能,如果多了呢?几十个,如果这些功能都可以随便组合,都不是必须具备的功能,那么你的逻辑代码需要多少,具体的功能组合形成的子类需要多少?我估计很多人到这就崩溃了。。。
如果拿代理来做,我们需要的是什么?接口,每个功能一个接口,这些接口被人的代理类实现(或者是适配器产生的具体实现类组合形成的策略模式),并会返回一个具备这些功能的person对象,我们仅需检查他具备不具备这些功能就可以,而不是还要检查一些额外的条件,而在某些功能失效,或者某些功能被加入的情况下,我们仅需要更换一下代理就行。这个可能不太好理解点,通俗来说就是,一个人没有胳膊,和有胳膊瘫痪的区别是不一样的。
这里频繁生成的各种功能组合的代理类的字节码是会存在于内存中,可能所有组合你都试过之后,一些不常用的组合会有内存溢出的风险,这时候就需要用到类加载机制和字节码技术,来把这些类的字节码文件像对象重用一样的进行重复利用,以避免大量的代理类造成内存溢出。 |