欢迎来到天天文库
浏览记录
ID:39550006
大小:52.50 KB
页数:7页
时间:2019-07-06
《Java动态代理一——动态类Proxy的使用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java动态代理一——动态类Proxy的使用1.什么是动态代理?答:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实。代理一般会实现它所表示的实际对象的接口。代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象。客户不知道它是与代理打交道还是与实际对象打交道。2.为什么使用动态代理?答:因为动态代理可以对请求进行任何处理3.使用它有哪些好处?答:因为动态代理可以对请求进行任何处理4.哪些地方需要动态代理?答:不允许直接访问某些类;对访问要
2、做特殊处理等目前Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。其实现主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。 Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现以下为模拟案例,通过动态代理实现在方法调用前后向控制台输出两句字符串目录结构定义一个HelloWorld接口1packagecom.ljq.test;23 /**4*定义一个Hel
3、loWorld接口5*6*@authorjiqinlin7*8*/9 publicinterfaceHelloWorld{10publicvoidsayHelloWorld();11}类HelloWorldImpl是HelloWorld接口的实现1packagecom.ljq.test;23 /**4*类HelloWorldImpl是HelloWorld接口的实现5*6*@authorjiqinlin7*8*/9 publicclassHelloWorldImplimplementsHelloWor
4、ld{1011publicvoidsayHelloWorld(){12System.out.println("HelloWorld!");13}1415}HelloWorldHandler是InvocationHandler接口实现1packagecom.ljq.test;23 importjava.lang.reflect.InvocationHandler;4 importjava.lang.reflect.Method;56 /**7*实现在方法调用前后向控制台输出两句字符串8*9*@authorjiq
5、inlin10*11*/12 publicclassHelloWorldHandlerimplementsInvocationHandler{13//要代理的原始对象14 privateObjectobj;1516publicHelloWorldHandler(Objectobj){17super();18this.obj=obj;19}2021/**22*在代理实例上处理方法调用并返回结果23*24*@paramproxy代理类25*@parammethod被代理的方法26*@paramargs该方法的参数
6、数组27*/28publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{29Objectresult=null;30//调用之前31 doBefore();32//调用原始对象的方法33result=method.invoke(obj,args);34//调用之后35doAfter();36returnresult;37}3839privatevoiddoBefore(){40System.out.println("be
7、foremethodinvoke");41}4243privatevoiddoAfter(){44System.out.println("aftermethodinvoke");45}4647}测试类packagecom.ljq.test;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Proxy;publicclassHelloWorldTest{publicstaticvoidmain(String[]args){Hell
8、oWorldhelloWorld=newHelloWorldImpl();InvocationHandlerhandler=newHelloWorldHandler(helloWorld);//创建动态代理对象HelloWorldproxy=(HelloWorld)Proxy.newProxyInstance(helloWorld.getClass().getClassLoader(),helloW
此文档下载收益归作者所有