Let's Go!

java 动态代理范例 InvocationHandler与Proxy,拦截与代理 (转载)

上一篇 / 下一篇  2011-02-23 17:51:05 / 个人分类:JAVA学习&编程相关

java 动态代理范例 InvocationHandler与Proxy,拦截与代理 (转载)

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. 方法调用结束  
http://chenjumin.javaeye.com/blog/339554

 

代码打包:

com.rar(1.8 KB)

 


TAG:

 

评分:0

我来说两句

Open Toolbar