黑马程序员 动态代理学习笔记一

来源:互联网 发布:java服务器类型 编辑:程序博客网 时间:2024/06/06 21:04

----------android培训、java培训、java学习型技术博客、期待与您交流!----------

 

动态代理:

         代理,顾名思义,就是代替别人为其实现相同的功能,比如说现实生活中的产品销售,对于自己生产的产品,自己可以直接销售给客户,也可以为了节约资本(时间上的或者劳力上的)而将产品交由某个中间商进行销售,但对于客户而言,他要的只是产品,或者确切的说是产品的功能,而产品除了可以从厂家那里直接获取,也可以从代理商那里得到,那么,代理商所代理的的核心应该是客户想要直接从产假那里得到的产品的核心,由此可知,代理商必须满足客户的核心要求,而该要求是可以从厂家那里获取的。

        

 


那么动态代理在Java程序中的体现是什么呢?张老师PPT里的这张图实在是太经典了,通过该图,一目了然。我的理解是,对于目标类的获取,若不用代理,我们走的是ClientàTargetà接口这条线,若使用代理,则走的是ClientàProxyà接口这条线,自然的,代理类不会那么傻,就仅仅是实现接口的功能,它也可以在代理的过程中加入业务功能代码,听课听到这里,我心里老是忍不住得意的笑,不难想到客户看到的只是接口的功能实现嘛,具体的业务逻辑被封装了的,那这里的花样就比较多了,嘿嘿,打广告啊,赚小费…...

jvm动态生成的代理类必须实现一个或者多个接口,所以动态代理只能用于实现相同接口的目标类的代理。CGLIB类可以动态生成一个类的子类,一个类的

子类也可以用作该类的代理,所以,要为一个没有实现接口的类生成动态代理类,你们可以使用CGLIB库.在动态代理类中我们传进去一个incocationHandler对象,当我们每调用一代理类的方法,都要执行一次invocationHandler的invoke方法。invoke方法接收3个参数,分别对应的是调用调用哪个接口,哪个接口的方法,方法里的参数。在method.invoke(target,args)中我们调用被代理类的方法,args是我们传进来的参数,我们可以对args进行处理后再返回给代理。所以我们在InvocationHandler中还要有一个真正的被代理类。

调用代理对象的从Objec类继承的hashCode,equals或者toString这几个方法时,代理对象将调用请求转发给InvocationHandler对象,对于其他的方法,则不转发调用请求。

代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置加上系统功能代码:
1.在调用目标方法之前
2.在调用目标方法之后
3.在调用目标方法前后
4.在处理目标方法异常的catch块中

总结:代理就是代替别人为其实现相同的功能。





----------android培训、java培训、java学习型技术博客、期待与您交流!----------

 

原创粉丝点击