• java 动态代理范例 InvocationHandler与Proxy


    java 动态代理范例 InvocationHandler与Proxy,拦截与代理

     

    java.lang.reflect.Proxy,
    Proxy 提供用于创建动态代理类和实例的静态方法.
    newProxyInstance()
    返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
    (详见api文档)

    java.lang.reflect.InvocationHandler,
    InvocationHandler 是代理实例的调用处理程序 实现的接口。
    invoke()
    在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上

    调用此方法。

     

    JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个拦截处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被调用的同时,执行处理器会被自动调用。    

     

    Java动态代理只能对实现了接口的类生成代理,不能针对类。其实现主要是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现。

     

         接口类源代码:

    Java代码
    1. public interface HelloWorld {   
    2.     public void sayHelloWorld();   
    3.  

     

         实现类源代码:

    Java代码
    1. public class HelloWorldImpl implements HelloWorld {   
    2.     public void sayHelloWorld() {   
    3.         System.out.println("Hello World!");   
    4.     }   
    5.  

     

         拦截器源代码:

    Java代码
    1. public class HelloWorldHandler implements InvocationHandler {   
    2.     //目标对象  
    3.     private Object targetObject;   
    4.        
    5.     public HelloWorldHandler(Object targetObject){   
    6.         this.targetObject targetObject;   
    7.     }   
    8.        
    9.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {   
    10.         System.out.println("方法调用前。。。");   
    11.   
    12.         Object result method.invoke(this.targetObject, args);   
    13.   
    14.         System.out.println("方法调用结束");   
    15.            
    16.         return result;   
    17.     }   
    18.  

     

         测试代码:

    Java代码
    1. public class HelloWorldTest {   
    2.     public static void main(String[] args) {   
    3.         //业务对象  
    4.         HelloWorld obj new HelloWorldImpl();   
    5.            
    6.         //拦截器对象  
    7.         HelloWorldHandler handler new HelloWorldHandler(obj);   
    8.            
    9.         //返回业务对象的代理对象  
    10.         HelloWorld proxy (HelloWorld)Proxy.newProxyInstance(   
    11.                 obj.getClass().getClassLoader(),    
    12.                 obj.getClass().getInterfaces(),    
    13.                 handler);   
    14.            
    15.         //通过代理对象执行业务对象的方法  
    16.         proxy.sayHelloWorld();   
    17.     }   
    18.  

     

         测试结果:

    Html代码
    1. 方法调用前。。。   
    2. Hello World!   
    3. 方法调用结束  
       




  • 相关阅读:
    Java设计模式之依赖倒置原则
    windows 下安装apache 遇到的问题
    Java序列化相关
    批量插入————优化
    接口相关
    Redis使用及工具类
    面试回顾——kafka
    面试回顾——List<T>排序
    Java面试——线程池
    面试回顾——session相关
  • 原文地址:https://www.cnblogs.com/jgig11/p/5764354.html
Copyright © 2020-2023  润新知