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. }  
  • 相关阅读:
    java 用代码实现判断字符串的开头和结尾
    java基础 1-path
    C#基础(语句 for循环)
    C#基础(数组)
    C#基础(语句 if else)
    C#基础(变量、常量、运算符)
    继承-person
    继承-字母表
    继承-monkey
    继承-people
  • 原文地址:https://www.cnblogs.com/hoobey/p/5294401.html
Copyright © 2011-2022 走看看