分享

彻底搞清 反射、静态代理、动态代理

 liang1234_ 2018-12-25
首先,说下应用场景

1.反射:主要跟类信息Class息息相关,即,只有在运行时,才能知道需要调用哪个(子)类或者调用哪个(子)类的哪个方法。如果事先就知道的话,那我们绝对不用反射,为什么不事先生成好对象,才不要每运行一次都生产一次对象,简直是恐怖。

2.静态代理:内部其实没有反射,是传进来被代理对象,然后在执行被代理对象的具体方法前后织入一些代理操作,所以静态代理的代理对象ProxyObj与被代理对象RealObj是需要实现共同的接口的。

3.动态代理:在基于静态代理的基础上,考虑到在某些应用场景下,静态代理对象ProxyObj其实是重复无意义的工作,比如我调RealObj所有的方法都是前打一行公共log,如果打印不同log用静态代理再适合不过,但是如果是做相同的事情,那这个ProxyObj里面就是重复无意义的操作了,所以动态代理就可以解决这个应用场景,动态代理类不再显性得定义,而是再运行时,通过反射动态生成,并且是根据传入进来得RealObj来对应生成一个代理对象,同时在每个方法中织入公共的代理操作。 其实我更愿意叫这个代理对象为被代理对象RealObj的变种,因为我没有实际定义一个代理对象,更不知道他内部有什么方法,我在调用它的方法的时候其实想的是RealObj内部的方法,所以我更愿意叫它被代理对象RealObj的变种,而不是代理对象。

所以,综上,究竟什么时候用静态代理,什么时候用动态代理,什么时候用反射就很清楚了。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多