Java静态代理和动态代理总结
静态代理
第一种实现(基于接口):
1》接口
publicinterfaceHello{ voidsay(Stringmsg); }
2》目标类,至少实现一个接口
publicclassHelloImplimplementsHello{ publicvoidsay(Stringmsg){ System.out.println("Hi,"+msg); } }
3》代理类(与目标类实现相同接口,从而保证功能一致)
publicclassHelloProxyimplementsHello{ privateHellohello; publicHelloProxy(Hellohello){ this.hello=hello; } publicvoidsay(Stringmsg){ before(); hello.say(msg); after(); } privatevoidbefore(){ System.out.println("Before"); } privatevoidafter(){ System.out.println("After"); } }
3》测试
/** *@AuthorLZHL *@Create2017-02-1910:26 *@Description */ publicclassMain{ publicstaticvoidmain(String[]args)throwsException{ HelloImpltarget=newHelloImpl(); HelloProxyproxy=newHelloProxy(target); proxy.say("LZHL"); } }
第二种实现(基于目标类):
1>目标类
publicclassHelloTarget{ publicvoidsayHello(Stringname){ System.out.println("Hi,"+name); } }
2>代理类(通过继承目标类,保证功能一致)
publicclassHelloProxyextendsHelloTarget{ privateHelloTargettarget; publicHelloProxy(HelloTargettarget){ this.target=target; } @Override publicvoidsayHello(Stringname){ this.before(); target.sayHello(name); this.after(); } privatevoidbefore(){ System.out.println("Before"); } privatevoidafter(){ System.out.println("After"); } }
3>测试
publicclassMain{ publicstaticvoidmain(String[]args)throwsException{ HelloTargettarget=newHelloTarget(); HelloProxyproxy=newHelloProxy(target); proxy.sayHello("LZHL"); } }
动态代理
动态代理的代理类是在程序运行期间动态生成的,也有两种实现,一种是JDK动态代理,一种是CGLib动态代理
1》JDK动态代理(基于接口实现,与目标类实现相同接口,从而保证功能一致)
/** *@AuthorLZHL *@Create2017-02-1912:46 *@Description */ publicclassMain{ publicstaticvoidmain(String[]args){ finalHelloImpltarget=newHelloImpl(); ObjectproxyInstance=Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),newInvocationHandler(){ /* *proxy:代理对象 *method:目标对象的方法对象 *args:目标对象方法的参数 *return:目标对象方法的返回值 */ publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{ System.out.println("before"); ObjectretValue=method.invoke(target,args); System.out.println("after"); returnretValue; } }); Helloproxy=(Hello)proxyInstance; proxy.say("LYX"); //可以把InvocationHandler提取出来,单独写一个类,为了方便大家看,这里我用内部类的形式 classJDKProxyimplementsInvocationHandler{ privateObjecttarget; publicJDKProxy(Objecttarget){ this.target=target; } publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{ before(); Objectresult=method.invoke(target,args); after(); returnresult; } privatevoidbefore(){ System.out.println("Before"); } privatevoidafter(){ System.out.println("After"); } } InvocationHandlerih=newJDKProxy(target); ObjectproxyInstance2=Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),ih); Helloproxy2=(Hello)proxyInstance2; proxy2.say("LZHL"); } }
2》CGLib动态代理(基于目标类,通过继承目标类,从而保证功能一致),需要导入cglib-3.2.4.jar包
pom.xml
<dependencies> <!--https://mvnrepository.com/artifact/cglib/cglib--> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.4</version> </dependency> </dependencies>
1)目标类
publicclassHi{ publicvoidsayHi(Stringmsg){ System.out.println("Hi,"+msg); } }
2)测试
/** *@AuthorLZHL *@Create2017-02-1913:19 *@Description */ publicclassMain{ publicstaticvoidmain(String[]args){ Enhancerenhancer=newEnhancer(); //设置父类 enhancer.setSuperclass(Hi.class); //设置回调函数 enhancer.setCallback(newMethodInterceptor(){ publicObjectintercept(Objecttarget,Methodmethod,Object[]args,MethodProxymethodProxy)throwsThrowable{ System.out.println("before"); ObjectretValue=methodProxy.invokeSuper(target,args); System.out.println("after"); returnretValue; } }); Objectproxy=enhancer.create(); Hihi=(Hi)proxy; hi.sayHi("LXY"); //可以把MethodInterceptor提取出来,单独写一个类,为了方便大家看,这里我用内部类的形式 classCGLibProxyimplementsMethodInterceptor{ public<T>TgetProxy(Class<T>clazz){ return(T)Enhancer.create(clazz,this); } publicObjectintercept(Objecttarget,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{ before(); Objectresult=proxy.invokeSuper(target,args); after(); returnresult; } privatevoidbefore(){ System.out.println("Before"); } privatevoidafter(){ System.out.println("After"); } } CGLibProxycgLibProxy=newCGLibProxy(); Hihi2=cgLibProxy.getProxy(Hi.class); hi2.sayHi("LZHL"); } }
以上所述是小编给大家介绍的Java静态代理和动态代理总结,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!