標籤: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動態代理