JAVA中静态代理与动态代理的区别有哪些

  介绍

这期内容当中小编将会给大家带来有关JAVA中静态代理与动态代理的区别有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

代理模式是JAVA中最常用的设计模式之一,尤其是在春天框架中广泛应用。对于JAVA的代理模式,一般可分为:静态代理,动态代理,以及CGLIB实现动态代理。

对于上述三种代理模式,分别进行说明。

<强> 1。静态代理

静态代理其实就是在程序运行之前,提前写好被代理方法的代理类,编译后运行。在程序运行之前,类已经存在。
下面我们实现一个静态代理演示:

癑AVA中静态代理与动态代理的区别有哪些"

静态代理

定义一个接口目标

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。动态代理

动态代理主要是通过反射机制,在运行时动态生成所需代理的类。

癑AVA中静态代理与动态代理的区别有哪些"

动态代理

接口

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中静态代理与动态代理的区别有哪些