zoukankan      html  css  js  c++  java
  • Dynamic Proxy (动态代理模式)

    动态代理(运行期行为)主要有一个 Proxy类 和一个 InvocationHandler接口

    动态代理角色:

    1. 抽象主题角色

    2. 真实主题角色(实现了抽象主题接口)

    3. 动态代理主题角色(实现了 InvocationHandler接口,并实现了 invoke()方法)

    Proxy 要调用 newProxyInstance方法

    代码演示:

    1.抽象主题角色 SubjectDemo.java

    [java] view plain copy
    1. package com.dynamicproxy ;  
    2.   
    3. public interface SubjectDemo  
    4. {  
    5.     public void request() ;  
    6. }  

    2. 真实主题角色 RealSubjectDemo.java

    [java] view plain copy
    1. package com.dynamicproxy ;  
    2.   
    3.   
    4. public class RealSubjectDemo implements SubjectDemo  
    5. {  
    6.     public void request()  
    7.     {  
    8.         System.out.println("实现了某请求") ;  
    9.     }  
    10. }  

    3. 动态代理主题角色 DynamicProxySubjectDemo.java

    [java] view plain copy
    1. package com.dynamicproxy ;  
    2.   
    3. import java.lang.reflect.InvocationHandler ;  
    4. import java.lang.reflect.Method ;  
    5.   
    6.   
    7. public class DynamicProxySubjectDemo implements InvocationHandler  
    8. {  
    9.     private Object sub ;  
    10.   
    11.     public DynamicProxySubjectDemo(Object obj)  
    12.     {  
    13.         this.sub = obj ;  
    14.     }  
    15.   
    16.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  
    17.     {  
    18.         System.out.println("before"+method) ;  
    19.   
    20.         method.invoke(sub, args) ;//真实的调用方法操作  
    21.   
    22.         System.out.println("after"+method) ;  
    23.   
    24.         return null ;  
    25.   
    26.     }  
    27.   
    28.   
    29. }  

    4.客户端 Client.java

    [java] view plain copy
    1. package com.dynamicproxy ;  
    2.   
    3. import java.lang.reflect.InvocationHandler ;  
    4. import java.lang.reflect.Proxy ;  
    5.   
    6. public class Client  
    7. {  
    8.     public static void main(String[] args)  
    9.     {  
    10.         RealSubjectDemo rsd = new RealSubjectDemo() ;  
    11.   
    12.         InvocationHandler handler = new DynamicProxySubjectDemo(rsd) ;  
    13.          
    14.         Class<?> classType = handler.getClass() ;  
    15.           
    16.         // classType.getClassLoader() 动态代理类的类加载器  
    17.         //rsd.getClass().getInterfaces() 代理类要实现的接口列表  
    18.         //handler 指派方法调用的调用处理程序  
    19.         SubjectDemo sd = (SubjectDemo)Proxy.newProxyInstance(classType.getClassLoader(), rsd.getClass().getInterfaces(), handler ) ;  
    20.           
    21.         //这行代码一执行 转到 InvocationHandler handler = new DynamicProxySubjectDemo(rsd)  
    22.          //执行invoke方法  
    23.         sd.request() ;  
    24.     }  
    25. }  
  • 相关阅读:
    HTML DOM querySelector() 方法
    jsonp和ajax
    开源协议许可
    【开发笔记】- 在Grails下查看打印真实的SQL
    【开发笔记】-MySQL数据库5.7+版本,编码格式设置
    【开发笔记】-Tomcat启动时设置Jdk版本
    来自GitHub的优秀开源项目系列
    【开发笔记】- 将MySQL数据库表中自增ID从0开始
    【开发笔记】- 在MySQL中 root账户被锁定怎么办
    【开发笔记】- 在Windows环境下后台启动redis
  • 原文地址:https://www.cnblogs.com/hoobey/p/5294401.html
Copyright © 2011-2022 走看看