介绍
这期内容当中小编将会给大家带来有关JAVA中静态代理与动态代理的区别有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
代理模式是JAVA中最常用的设计模式之一,尤其是在春天框架中广泛应用。对于JAVA的代理模式,一般可分为:静态代理,动态代理,以及CGLIB实现动态代理。
对于上述三种代理模式,分别进行说明。
<强> 1。静态代理强>
静态代理其实就是在程序运行之前,提前写好被代理方法的代理类,编译后运行。在程序运行之前,类已经存在。
下面我们实现一个静态代理演示:
静态代理
定义一个接口目标
package com.test.proxy; public interface  Target { public 才能;String 执行(); }
TargetImpl实现接口目标
package com.test.proxy; public class  TargetImpl implements Target  { @Override才能 public 才能;String 执行(),{ ,,,System.out.println (“TargetImpl 执行!“); ,,,return “execute"; ,,} }
代理类
package com.test.proxy; {public class  Proxy implements 目标 private 才能Target 目标; public 才能;代理(Target 目标),{ ,,,this.target =,目标; ,,} @Override才能 public 才能;String 执行(),{ ,,,System.out.println (“perProcess"); ,,,String result =, this.target.execute (); ,,,System.out.println (“postProcess"); ,,,return 结果; ,,} }
测试类:
package com.test.proxy; public class  ProxyTest { public 才能;static  void main (String [], args), { ,,,Target Target =, new TargetImpl (); ,,,Proxy p =, new 代理(目标); ,,,String result =, p.execute (); ,,,System.out.println(结果); ,,} }
运行结果:
perProcess TargetImpl 执行! 后处理 执行
静态代理需要针对被代理的方法提前写好代理类,如果被代理的方法非常多则需要编写很多代码,因此,对于上述缺点,通过动态代理的方式进行了弥补。
<强> 2。动态代理强>
动态代理主要是通过反射机制,在运行时动态生成所需代理的类。
动态代理
接口
package com.test.dynamic; public interface  Target { public 才能;String 执行(); }
实现类
package com.test.dynamic; public class  TargetImpl implements Target  { @Override才能 public 才能;String 执行(),{ ,,,System.out.println (“TargetImpl 执行!“); ,,,return “execute"; ,,} }
代理类
package com.test.dynamic; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class  DynamicProxyHandler implements  InvocationHandler { private 才能Target 目标; public 才能;DynamicProxyHandler (Target 目标),{ ,,,this.target =,目标; ,,} @Override才能 public 才能;Object 调用(Object 代理,Method 方法,对象[],args), throws Throwable { ,,,System.out.println(“前==================?; ,,,Object result =, method.invoke(目标,args); ,,,System.out.println(“后===================?; ,,,return 结果; ,,} }
测试类
package com.test.dynamic; import java.lang.reflect.Proxy; public class  DynamicProxyTest { public 才能;static  void main (String [], args), { ,,,Target Target =, new TargetImpl (); ,,,DynamicProxyHandler handler =, new DynamicProxyHandler(目标); ,,,Target proxySubject =,(目标),Proxy.newProxyInstance (TargetImpl.class.getClassLoader (), TargetImpl.class.getInterfaces(),处理程序); ,,,String result =, proxySubject.execute (); ,,,System.out.println(结果); ,,} }JAVA中静态代理与动态代理的区别有哪些