首页 > 代码库 > Java反射、Java代理模式

Java反射、Java代理模式

简单来说,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的反射和动态代理实现原理参照: 反射机制与动态代理,写的很好理解很到位,给个赞!

   

    

 

Java反射、Java代理模式