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静态代理和动态代理总结,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!