java 動態代理學習(Proxy,InvocationHandler)
來源:互聯網
上載者:User
前幾天看到java的動態代理機制,不知道是啥玩意,然後看了看。死活不知道
invoke(Object proxy, Method m, Object[] args)種的proxy是個什麼東西,放在這裡有什麼用。於是網上到處搜刮,把自己的理解寫了寫。
Java代碼 /** * 相親介面 * * @author zhengt * @time Jun 3, 2095 3:13:03 PM */ public interface XiangQinInterface { /** * 相親方法 */ public void xiangQin(); } /** * 張三相親實作類別 * * @author zhengt * @time Jun 3, 2095 3:14:48 PM */ public class ZhangSanXiangQinInterfaceImpl implements XiangQinInterface { public void xiangQin() { System.out.println("張三去相親,娶個漂亮老婆。"); } } import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 相親可是一輩子的大事,相親前要準備一下,打扮得帥氣些。 * * @author zhengt * @time Jun 3, 2095 3:15:48 PM */ public class ReadyInvocationHandler implements InvocationHandler { //相親介面的實作類別,也就是張三相親類 private Object zhangSan = null; public ReadyInvocationHandler(Object realSubject) { this.zhangSan = realSubject; } public Object invoke(Object proxy, Method m, Object[] args) { Object result = null; try { /** * 動態代理類$Proxy0調用xiangQin方法時會調用它自己的xiangQin方法, * 而它自己的xiangQin方法裡面調用的是super.h.invoke(this, , ),也就是父類Proxy的h的invoke方法, * 也就是ReadyInvocationHandler類的invoke方法。 * 所以,invoke(Object proxy, Method m, Object[] args)種的proxy實際上就是動態代理類$Proxy0, * 如果你將其強轉成XiangQinInterface然後調用它的xiangQin方法,然後它就會調用super.h.invoke(this, , ),這樣就會死迴圈。 */ /** * 網上關於這裡最多問題就是Object proxy放在這裡用來做什麼呢。這個我也不知道, * 不過至少我們知道它到底是個什麼東西,具體做什麼用嘛就不得而知了 */ System.out.println(proxy.getClass().getSimpleName()); System.out.println("張三相親前,代理人給他打扮了打扮。"); result = m.invoke(zhangSan, args); } catch (Exception ex) { System.exit(1); } return result; } } import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 張三來到了婚介所(相親現場),開始相親。 * * @author zhengt * @time Jun 3, 2095 3:17:16 PM */ public class HunJieSuo { public static void main(String args[]) { //先將張三相親這個相親的實作類別執行個體化,也就是得到XiangQinInterface介面的一個執行個體對象 &nb