Java代理设计模式详解

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java代理设计模式详解脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

代理即通过代理类,找到适合你的实现类。相当于现实生活中的中介的角色,你想租房子,这个时候你又不想自己找房子,那你可以找中介,通过中介找到合适自己的房子,同时你也可以让中介帮你签合同等其他事宜。代理存在静态代理和动态代理两种

静态代理

public interface Sourceable {       public void method();   }  
public class Source implements Sourceable {          @override       public void method() {           System.out.PRintln("the original method!");       }   }  
public class Proxy implements Sourceable {          private Source source;       public Proxy(){           suPEr();           this.source = new Source();       }       @Override       public void method() {         //新增的处理,个性化处理         before();           source.method();           atfer();       }       private void atfer() {           System.out.println("after proxy!");       }       private void before() {           System.out.println("before proxy!");       }   }  

测试类

public class Proxytest {          public static void main(String[] args) {           Sourceable source = new Proxy();           source.method();       }      }  

动态代理

JDK动态代理、AOP动态代理

Proxy提供了用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类

创建动态代理类

static Class<?>getProxyClass(ClassLoader loader,Class<?>...interfaces):创建一个动态代理类锁对应的Class对象,该代理类将实现interface所指定的多个接口,第一个ClassLoader 参数指生成动态代理类的类加载器。

创建动态代理对象

static Object newProxyInstance(ClassLoader loader,Class<?>...interfaces,InvocationHadnler h):直接创建一个动态代理对象,该代理对象的实现类实现了interfaces指定的系列接口,执行代理对象的每个方法时都会被替换执行InvocationHadnler对象的invoke方法

public interface Colorable {      public void value(); }
public class redColor implements Colorable{      @Override         public void value() {             System.out.println("--------------red-------------");         } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;  public class ColorableProxy implements InvocationHandler {      private Colorable colorable;     private Colorable proxy;      public ColorableProxy(Colorable colorable) {         this.colorable = colorable;         this.proxy = (Colorable) Proxy.newProxyInstance(                 Colorable.class.getClassLoader(),                 new Class<?>[] { Colorable.class }, this);     }      public Colorable getProxy() {         return proxy;     }      @Override     public Object invoke(Object proxy, Method method, Object[] args)             throws Throwable {         String methodName = method.getName();          System.out.println("===========starting invoke function:" + methodName                 + "==========");          Object result = method.invoke(colorable, args);          System.out.println("=========== invoke function:" + methodName                 + " success==========");         return result;     }      public static void main(String[] args) {          Colorable proxy = new ColorableProxy(new RedColor()).getProxy();         //真正调用invoke方法是在这一步才被激发的,可以debug试一下         proxy.value();     }  }

结果

===========starting invoke function:value========== --------------red------------- =========== invoke function:value success==========

proxy:代表动态代理对象

method:代表正在执行的方法

args:代表调用目标方法时传入的实参

AOP动态代理

Java代理设计模式详解

public interface Colorable {      public void value(); }
public class RedColor implements Colorable{      @Override         public void value() {             System.out.println("--------------red-------------");         } }
public class ToolUtility {      public void method(){         System.out.println("运行工具方法");     } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;  public class ColorableAOProxy implements InvocationHandler {     private Colorable colorable;     private Colorable proxy;      public ColorableAOProxy(Colorable colorable) {         this.colorable = colorable;         this.proxy = (Colorable) Proxy.newProxyInstance(                 Colorable.class.getClassLoader(),                 new Class<?>[] { Colorable.class }, this);     }      public Colorable getProxy() {         return proxy;     }      @Override     public Object invoke(Object proxy, Method method, Object[] args)             throws Throwable {         ToolUtility tool = new ToolUtility();         tool.method();         String methodName = method.getName();         System.out.println("===========starting invoke function:" + methodName                 + "==========");         Object result = method.invoke(colorable, args);          System.out.println("=========== invoke function:" + methodName                 + " success==========");         return result;     }      public static void main(String[] args) {         Colorable proxy = new ColorableAOProxy(new RedColor()).getProxy();         // 真正调用invoke方法是在这一步才被激发的,可以debug试一下         proxy.value();     } }

结果

运行工具方法 ===========starting invoke function_value========== --------------red------------- =========== invoke function:value success========== 

更多内容可以关注微信公众号或者访问AppZone网站

Java代理设计模式详解

脚本宝典总结

以上是脚本宝典为你收集整理的Java代理设计模式详解全部内容,希望文章能够帮你解决Java代理设计模式详解所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。