Java動態代理

來源:互聯網
上載者:User

標籤:java   動態代理   

動態代理涉及到的5個類:1. 介面Interface  2.被代理類 3.動態代理處理類  4.測試類別  5.產生的代理類

整個過程就是:先調用Proxy.newProxyInstance()方法,傳入介面,class loader以及動態代理處理類(被代理類是處理類的一個屬性,作為參數傳入),這個方法產生介面的一個實作類別(代理類),這個代理類繼承自Proxy類,所以可以得到傳入到Proxy類的動態代理處理類,代理類還實現了介面的所有方法,每個方法體就是去調用動態代理處理類的invoke方法,把方法體裡被調用時傳來的參數再傳到invoke方法裡去,這樣就實現了動態代理~

1. 介面Interface

package proxy;public interface Interface {void doSomething();void somethingElse(String args);}

2.被代理類

package proxy;public class RealObject implements Interface {@Overridepublic void doSomething() {// TODO Auto-generated method stubSystem.out.println("realObject do something");}@Overridepublic void somethingElse(String args) {// TODO Auto-generated method stubSystem.out.println("realObject something else ,args:" + args);}}

3.動態代理處理類

package proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class ProxyHandler implements InvocationHandler {private RealObject realObj;public ProxyHandler(RealObject realObj) {// TODO Auto-generated constructor stubthis.realObj = realObj;}@Overridepublic Object invoke(Object arg0, Method arg1, Object[] arg2)throws Throwable {// TODO Auto-generated method stubSystem.out.println("before proxy");arg1.invoke(realObj, arg2);System.out.println("after proxy");return null;}}

4.測試類別

package proxy;import java.lang.reflect.Proxy;public class ProxyTest {public static void main(String[] args) {RealObject realObj = new RealObject();Interface proxy = (Interface) Proxy.newProxyInstance(Interface.class.getClassLoader(),new Class[] { Interface.class }, new ProxyHandler(realObj));System.out.println(proxy.getClass());proxy.doSomething();proxy.somethingElse("dayna");////        byte[] proxyClassFile = ProxyGenerator.generateProxyClass(//                "DaynaProxy", new Class[] { Interface.class });}}

5.產生的代理類

import com.pactera.oscar.fwapp2.pqs.eb.view.Interface;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.lang.reflect.UndeclaredThrowableException;public final class DaynaProxy extends Proxy  implements Interface{  private static Method m1;  private static Method m0;  private static Method m3;  private static Method m4;  private static Method m2;  public DaynaProxy(InvocationHandler paramInvocationHandler)    throws   {    super(paramInvocationHandler);  }  public final boolean equals(Object paramObject)    throws   {    try    {      return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();    }    catch (RuntimeException localRuntimeException)    {      throw localRuntimeException;    }    catch (Throwable localThrowable)    {    }    throw new UndeclaredThrowableException(localThrowable);  }  public final int hashCode()    throws   {    try    {      return ((Integer)this.h.invoke(this, m0, null)).intValue();    }    catch (RuntimeException localRuntimeException)    {      throw localRuntimeException;    }    catch (Throwable localThrowable)    {    }    throw new UndeclaredThrowableException(localThrowable);  }  public final void doSomething()    throws   {    try    {      this.h.invoke(this, m3, null);      return;    }    catch (RuntimeException localRuntimeException)    {      throw localRuntimeException;    }    catch (Throwable localThrowable)    {    }    throw new UndeclaredThrowableException(localThrowable);  }  public final void somethingElse(String paramString)    throws   {    try    {      this.h.invoke(this, m4, new Object[] { paramString });      return;    }    catch (RuntimeException localRuntimeException)    {      throw localRuntimeException;    }    catch (Throwable localThrowable)    {    }    throw new UndeclaredThrowableException(localThrowable);  }  public final String toString()    throws   {    try    {      return (String)this.h.invoke(this, m2, null);    }    catch (RuntimeException localRuntimeException)    {      throw localRuntimeException;    }    catch (Throwable localThrowable)    {    }    throw new UndeclaredThrowableException(localThrowable);  }  static  {    try    {      m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });      m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);      m3 = Class.forName("com.pactera.oscar.fwapp2.pqs.eb.view.Interface").getMethod("doSomething", new Class[0]);      m4 = Class.forName("com.pactera.oscar.fwapp2.pqs.eb.view.Interface").getMethod("somethingElse", new Class[] { Class.forName("java.lang.String") });      m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);      return;    }    catch (NoSuchMethodException localNoSuchMethodException)    {      throw new NoSuchMethodError(localNoSuchMethodException.getMessage());    }    catch (ClassNotFoundException localClassNotFoundException)    {    }    throw new NoClassDefFoundError(localClassNotFoundException.getMessage());  }}



Java動態代理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.