标签:cat 回调函数 执行方法 代理类 类对象 部分 web www 功能
简单来说,JAVA反射是利用类名称来获得这个类的所有信息;代理,是有个传递过程,将自己的类对象传给其他类,让其他类来代理自己的类对象然后做事;
比喻:订外卖,送餐小哥手里的外卖就是我的对象,是我让他送的。静态代理就是我告诉送餐小哥外卖是我的(假设外卖小哥认识我),然后他直接就奔着我来了;动态代理就是我不告诉送餐小哥我是谁,他也不认识我,我只告诉他我的电话或者地址,他自己想办法找到我;注意,他有什么办法找到我呢?就是反射,他利用我的电话和地址,就知道我的一切了(夸张的说)就可以找到我了。
下面通过实例来讲解这两个息息相关的知识点:
1.反射
以servlet为例,在我们的WEB项目,在web.xml文件中通常有这样的配置信息,
<web-app> <servlet> <servlet-name>Test</servlet-name> <servlet-class>moreservlets.TestServlet</servlet-class> </servlet> </web-app>
然后,我们部署项目在服务器(tomcat/WebSphere)中,注意,这个时候在服务器上并没有源代码,只有class文件,那么服务器是怎么找到这个servlet类,并生成对象执行方法呢?就是通过反射,在服务器就会通过反射机制利用提供的类名(moreservlets.TestServlet)生成这个类在new对象然后使用对象的一切内容。
补充:我们知道JAVAEE规范中有两个重要的规范:JSP/SERVLET和EJB;而tomcat仅仅支持前者,也就是说,我们如果编写一个遵循EJB的规范的类,部署在tomcat上,尽管大家都是JAVA语言,但是tomcat服务器也是不认识的,因为tomcat服务器只能解析符合JSP/SERVLET规范的类,更进一步的说,即使tomcat服务器通过反射机制还原了一个遵循EJB的规范的类,依然不能使用这类的对象,因为规范不一致。参见:servlet规范、EJB规范。试想没有这种技术,xml用处也不大了,起码上述代码中,服务器解析完之后,得到的仅仅是一个类名,有嘛意思……
2、代理
其实明白反射机制,动态代理就显得很简单,静态代理不涉及反射。动态代理的用处是需要在原来的方法的功能基础上再添加一些功能,而不用改变这个方法的签名,原来调用这个方法的类依然能正常工作。典型案例就是AOP,还有HADOOP中RCP下图:。
静态代理:被代理的类可以直接并且很明确地将告诉(传递)代理类自己的具体对象。
动态代理:被代理类不能直接告诉代理类有关自己对象的信息,智能提供部分信息,剩余的部分需要代理类根据已有信息动态生成被代理类。
代理模式的话就要和回调函数的原理拿来一起说明会更明白:
回调函数:A调用B,同时传A给B。B执行完会调用A的方法(回调)。
目的就是:A发起调用B,B处理完一些事情,再回调执行A的一些操作。
两者关系:A和B是关联关系。
代理与回调的区别:
代理,代理类能够代表被代理的前提下(代理类要实现被代理的接口,作为我的代理人,起码得跟我某些重要方面是一个立场吧!)。最终执行我固有方法的类,外貌跟我相似。我是主角。
回调,最终执行我固有方法的类,外貌不强调(你可以不实现我实现的接口)。强调的是,你执行的时候一定要叫上我(一般的回调函数,就做callback,意思就是,喂!该你了!),而作为我也是要传递自己的对象给人家。人家是主角。
代理与回调的相似:都通过别人来执行自己固有的方法。代理与回调主要关注的别人怎么来调你。代理调用自己的方法,方法名跟自己一样;回调调用自己的方法,方法名没要求。
如果想要了解JAVA的反射和动态代理实现原理参照: 反射机制与动态代理,写的很好理解很到位,给个赞!
标签:cat 回调函数 执行方法 代理类 类对象 部分 web www 功能
原文地址:http://www.cnblogs.com/java-oracle/p/6280417.html