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. 方法调用结束  
     




posted on 2015-06-28 10:28  jgig11  阅读(296)  评论(0编辑  收藏  举报