歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

簡簡單單的代碼讓你輕松學會動態代理

前言:

最近一直在分析Hadoop的RPC機制。在Hadoop中,DataNode和NameNode之間的控制信息的交流是通過RPC機制完成的,采用的是動態代理和java NIO(參考:http://www.linuxidc.com/Linux/2012-06/62080.htm) 的方式。DataNode端是通過獲得NameNode的代理,通過該代理和NameNode進行通信的,為了更好的分析hadoop的RPC機制我想先分析一下動態代理是怎麼實現。下面就是動態代理的最最簡單的代碼實現,我們一起來看看吧。

代碼如下:

  1. package cn.xiaolu;  
  2.  
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.Proxy;  
  6.  
  7. /**  
  8.  * 動態代理類使用到了一個接口InvocationHandler和一個代理類Proxy ,這兩個類配合使用實現了動態代理的功能。  
  9.  * 那麼什麼是動態代理呢?  
  10.  * 我們平常說的代理類是指: 給每個具體類寫一個代理類,以後要使用某個具體類時,只要創建它的代理類的對象,然後調用代理類的方法就可以了。  
  11.  * 可是如果現在有許多的具體類,那就需要有許多的代理類才可以,這樣很顯然不合適。所以動態代理就應運而生了,我們只要寫一個類實現  
  12.  * InvocationHandler 並實現它的invoke方法,然後再用Proxy的工廠方法newProxyInstance()創建一個代理對象,這個對象同樣可以實現對具體類的代理功能。  
  13.  * 而且想代理哪個具體類,只要給Handler(以下代碼中的Invoker)的構造器傳入這個具體對象的實例就可以了。感覺是不是自己為該具體類造了一個代理類呢?呵呵~  
  14.  */ 
  15.  
  16. //接口類  
  17. interface AbstractClass {  
  18.  
  19.     public void show();  
  20.  
  21. }  
  22.  
  23. // 具體類A  
  24. class ClassA implements AbstractClass {  
  25.  
  26.     @Override 
  27.     public void show() {  
  28.         // TODO Auto-generated method stub  
  29.         System.out.println("我是A類!");  
  30.     }  
  31. }  
  32.  
  33. // 具體類B  
  34. class ClassB implements AbstractClass {  
  35.  
  36.     @Override 
  37.     public void show() {  
  38.         // TODO Auto-generated method stub  
  39.         System.out.println("我是B類!");  
  40.     }  
  41. }  
  42. //動態代理類,實現InvocationHandler接口  
  43. class Invoker implements InvocationHandler {  
  44.     AbstractClass ac;  
  45.  
  46.     public Invoker(AbstractClass ac) {  
  47.         this.ac = ac;  
  48.     }  
  49.  
  50.     @Override 
  51.     public Object invoke(Object proxy, Method method, Object[] arg)  
  52.             throws Throwable {  
  53.         //調用之前可以做一些處理  
  54.         method.invoke(ac, arg);  
  55.         //調用之後也可以做一些處理  
  56.         return null;  
  57.     }  
  58. }  
  59.  
  60. /**  
  61.  * 測試類  
  62.  * @author 小路  
  63.  */ 
  64. class DynamicProxyTest {  
  65.  
  66.     public static void main(String[] args) {  
  67.         //創建具體類ClassB的處理對象  
  68.         Invoker invoker1=new Invoker(new ClassA());  
  69.         //獲得具體類ClassA的代理  
  70.         AbstractClass ac1 = (AbstractClass) Proxy.newProxyInstance(  
  71.                 AbstractClass.class.getClassLoader(),  
  72.                 new Class[] { AbstractClass.class }, invoker1);  
  73.         //調用ClassA的show方法。  
  74.         ac1.show();  
  75.          
  76.          
  77.         //創建具體類ClassB的處理對象  
  78.         Invoker invoker2=new Invoker(new ClassB());  
  79.         //獲得具體類ClassB的代理  
  80.         AbstractClass ac2 = (AbstractClass) Proxy.newProxyInstance(  
  81.                 AbstractClass.class.getClassLoader(),  
  82.                 new Class[] { AbstractClass.class }, invoker2);  
  83.         //調用ClassB的show方法。  
  84.         ac2.show();  
  85.  
  86.     }  

程序運行後的結果如下:

我是A類!
我是B類!

擴展閱讀:

關於hadoop RPC機制分析的文章,地址: http://www.linuxidc.com/Linux/2012-06/62081.htm,希望大家繼續關注。

Copyright © Linux教程網 All Rights Reserved