网站首页 网站导航 课程中心
新闻中心
您所在的位置:Java培训 > 新闻中心 > Java的动态代理机制详解(一)

Java的动态代理机制详解(一)

来源:中软卓越 日期:2017-05-22 13:42 人气:
标签: Java培训  Java学习  Java动态 
中软国际教育集团Python+大数据课程入驻大武汉啦!!!
  Java的动态代理机制详解(一)
       在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是中软卓越Java培训对java的动态机制进行一个回顾。
  
  在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler(Interface)、另一个则是Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的:
  
  InvocationHandler:
  
  InvocationHandleristheinterfaceimplementedbytheinvocationhandlerofaproxyinstance.Eachproxyinstancehasanassociatedinvocationhandler.Whenamethodisinvokedonaproxyinstance,themethodinvocationisencodedanddispatchedtotheinvokemethodofitsinvocationhandler.
  
  每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的invoke方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法invoke方法:
  
  Objectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable
  
  我们看到这个方法一共接受三个参数,那么这三个参数分别代表什么呢?
  
  proxy:指代我们所代理的那个真实对象
  
  method:指代的是我们所要调用真实对象的某个方法的Method对象
  
  args:指代的是调用真实对象某个方法时接受的参数
  
  如果不是很明白,等下通过一个实例会对这几个参数进行更深的讲解。
  
  接下来我们来看看Proxy这个类:
  
  Proxyprovidesstaticmethodsforcreatingdynamicproxyclassesandinstances,anditisalsothesuperclassofalldynamicproxyclassescreatedbythosemethods.
  
  Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是newProxyInstance这个方法:
  
  publicstaticObjectnewProxyInstance(ClassLoaderloader,Class<?>[]interfaces,InvocationHandlerh)throwsIllegalArgumentExceptionReturnsaninstanceofaproxyclassforthespecifiedinterfacesthatdispatchesmethodinvocationstothespecifiedinvocationhandler.
  
  这个方法的作用就是得到一个动态的代理对象,其接收三个参数,我们来看看这三个参数所代表的含义:
  
  loader:一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
  
  interfaces:一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
  
  h:一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
  
  好了,在介绍完这两个接口(类)以后,我们来通过一个实例来看看我们的动态代理模式是什么样的:
  
  首先我们定义了一个Subject类型的接口,为其声明了两个方法:
  
  publicinterfaceSubject{publicvoidrent();publicvoidhello(Stringstr);}
  
  接着,定义了一个类来实现这个接口,这个类就是我们的真实对象,RealSubject类:
  
  publicclassRealSubjectimplementsSubject{@Overridepublicvoidrent(){System.out.println("Iwanttorentmyhouse");}@Overridepublicvoidhello(Stringstr){System.out.println("hello:"+str);}}
  
  下一步,我们就要定义一个动态代理类了,前面说个,每一个动态代理类都必须要实现InvocationHandler这个接口,因此我们这个动态代理类也不例外:
  
  publicclassDynamicProxyimplementsInvocationHandler{//这个就是我们要代理的真实对象privateObjectsubject;//构造方法,给我们要代理的真实对象赋初值publicDynamicProxy(Objectsubject){this.subject=subject;}@OverridepublicObjectinvoke(Objectobject,Methodmethod,Object[]args)throwsThrowable{//在代理真实对象前我们可以添加一些自己的操作System.out.println("beforerenthouse");System.out.println("Method:"+method);//当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用method.invoke(subject,args);//在代理真实对象后我们也可以添加一些自己的操作System.out.println("afterrenthouse");returnnull;}}
  
  中软卓越以Java课程作为主打课程之一,课程内容全部提炼自企业一线岗位实际工作经验和能力标准;课程内容来自于企业岗位需求又高于企业岗位任职标准;不仅满足应聘时工作需求,又着眼于未来职业发展需要。课程体系严密,围绕企业需求,以实战项目导入教学体系;模块课程完整,每个模块对应一类岗位,将所有岗位能力对应到各个模块;课程内容全面,所有课程内容吸纳最新Java知识,全面覆盖了各个知识点,中软卓越用技术改变你的未来,用责任帮你谱写人生!

中软卓越是中软国际有限公司投资的大型人才服务机构,是中软国际人才战略的核心组成部分之一,承担集团发展过程中人才储备和培养的任务,是软件及外包业务快速发展的重要人才支撑平台,是集团保持高速增长动力之一。

中软国际教育集团专注IT教育36年,一直秉承“用良心做教育”的理念,是中国移动互联网研发人才一体化服务的开拓者,全力打造移动互联网研发人才服务优质平台。

公司总部位于武汉,目前已在深圳、上海、郑州、广州、大连、武汉、成都、西安、杭州、重庆、长沙、合肥、无锡、南宁、厦门、南京、南昌等全国22个省成立了60多家分公司。拥有全国的移动互联网教学就业保障团队,做到了毕业学员业内高薪水,成为学员信赖的IT培训机构。

营业执照 版权所有©Copyright 2008-2017,武汉中软卓越科技有限公司 , All Rights Reserved. ICP备案号:15018648号-1

sitemap | 来校路线 | 分类导航 | 关于我们