1. 程式人生 > >Java動態代理(JDK 和CGLIB、Javassist、ASM之間的差別)

Java動態代理(JDK 和CGLIB、Javassist、ASM之間的差別)

  1. import com.foo.proxy.Rechargable;  
  2. import com.foo.proxy.Vehicle;  
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.Proxy;  
  6. import java.lang.reflect.UndeclaredThrowableException;  
  7. /** 
  8.  生成的動態代理類的組織模式是繼承Proxy類,然後實現需要實現代理的類上的所有介面,而在實現的過程中,則是通過將所有的方法都交給了InvocationHandler來處理 
  9. */  
  10.  public final class ElectricCarProxy extends Proxy  
  11.   implements Rechargable, Vehicle  
  12. {  
  13.   private static Method m1;  
  14.   private static Method m3;  
  15.   private static Method m4;  
  16.   private static Method m0;  
  17.   private static Method m2;  
  18.   public ElectricCarProxy(InvocationHandler paramInvocationHandler)  
  19.     throws   
  20.   {  
  21.     super(paramInvocationHandler);  
  22.   }  
  23.   public final boolean equals(Object paramObject)  
  24.     throws   
  25.   {  
  26.     try  
  27.     { // 方法功能實現交給InvocationHandler處理  
  28.       return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();  
  29.     }  
  30.     catch (Error|RuntimeException localError)  
  31.     {  
  32.       throw localError;  
  33.     }  
  34.     catch (Throwable localThrowable)  
  35.     {  
  36.       throw new UndeclaredThrowableException(localThrowable);  
  37.     }  
  38.   }  
  39.   public final void recharge()  
  40.     throws   
  41.   {  
  42.     try  
  43.     {  
  44.        // 方法功能實現交給InvocationHandler處理  
  45.       this.h.invoke(this, m3, null);  
  46.       return;  
  47.     }  
  48.     catch (Error|RuntimeException localError)  
  49.     {  
  50.       throw localError;  
  51.     }  
  52.     catch (Throwable localThrowable)  
  53.     {  
  54.       throw new UndeclaredThrowableException(localThrowable);  
  55.     }  
  56.   }  
  57.   public final void drive()  
  58.     throws   
  59.   {  
  60.     try  
  61.     {  
  62.        // 方法功能實現交給InvocationHandler處理  
  63.       this.h.invoke(this, m4, null);  
  64.       return;  
  65.     }  
  66.     catch (Error|RuntimeException localError)  
  67.     {  
  68.       throw localError;  
  69.     }  
  70.     catch (Throwable localThrowable)  
  71.     {  
  72.       throw new UndeclaredThrowableException(localThrowable);  
  73.     }  
  74.   }  
  75.   public final int hashCode()  
  76.     throws   
  77.   {  
  78.     try  
  79.     {  
  80.        // 方法功能實現交給InvocationHandler處理  
  81.        return ((Integer)this.h.invoke(this, m0, null)).intValue();  
  82.     }  
  83.     catch (Error|RuntimeException localError)  
  84.     {  
  85.       throw localError;  
  86.     }  
  87.     catch (Throwable localThrowable)  
  88.     {  
  89.       throw new UndeclaredThrowableException(localThrowable);  
  90.     }  
  91.   }  
  92.   public final String toString()  
  93.     throws   
  94.   {  
  95.     try  
  96.     {  
  97.        // 方法功能實現交給InvocationHandler處理  
  98.       return (String)this.h.invoke(this, m2, null);  
  99.     }  
  100.     catch (Error|RuntimeException localError)  
  101.     {  
  102.       throw localError;  
  103.     }  
  104.     catch (Throwable localThrowable)  
  105.     {  
  106.       throw new UndeclaredThrowableException(localThrowable);  
  107.     }  
  108.   }  
  109.   static  
  110.   {  
  111.     try  
  112.     {  //為每一個需要方法物件,當呼叫相應的方法時,分別將方法物件作為引數傳遞給InvocationHandler處理  
  113.       m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });  
  114.       m3 = Class.forName("com.foo.proxy.Rechargable").getMethod("recharge", new Class[0]);  
  115.       m4 = Class.forName("com.foo.proxy.Vehicle").getMethod("drive", new Class[0]);  
  116.       m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);  
  117.       m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);  
  118.       return;  
  119.     }  
  120.     catch (NoSuchMethodException localNoSuchMethodException)  
  121.     {  
  122.       throw new NoSuchMethodError(localNoSuchMethodException.getMessage());  
  123.     }  
  124.     catch (ClassNotFoundException localClassNotFoundException)  
  125.     {  
  126.       throw new NoClassDefFoundError(localClassNotFoundException.getMessage());  
  127.     }  
  128.   }  
  129. }