Posted on 2005-07-29 11:10
魔之卡卡 閱讀(493)
評論(0) 編輯 收藏 所屬分類:
我的JAVA
Java 1.3引入了名為“動態代理類”(Dynamic Proxy Class)的新特性,利用它可為“已知接口的實現”動態地創建包裝器(wrapper)類。
使用動態代理,你創建的包裝器類不要求為所有方法都使用顯式的包裝器,創建的子類也不要求具有嚴格的出身,兩者方法可任選一種你認為最好的。但是,動態代理仍然有一個限制。當你使用動態代理時,要包裝/擴展的對象必須實現一個接口,該接口定義了準備在包裝器中使用的所有方法。這一限制的宗旨是鼓勵良好的設計,而不是為你帶來更多的麻煩。根據經驗,每個類都至少應該實現一個接口(nonconstant接口)。良好的接口用法不僅使動態代理成為可能,還有利于程序的模塊化。
2種寫invoke()
注意:必須有return method.invoke(wrapped, args)
以下內容為程序代碼:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Class[] paramTypes = method.getParameterTypes(); for (int i=0; i < paramTypes.length; i++) { if (Tool.class.isAssignableFrom(paramTypes[i])) { args[i] = Tool.RATCHET; } } return method.invoke(wrapped, args); }
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { Object result; try { System.out.println("before method " + m.getName()); result = m.invoke(obj, args); } catch (InvocationTargetException e) { throw e.getTargetException(); } catch (Exception e) { throw new RuntimeException("unexpected invocation exception: " + e.getMessage()); } finally { System.out.println("after method " + m.getName()); } return result; } } | |
運行效果如下:
before method bar
after method bar
dynamic proxy的實戰步驟
實際上dynamic proxy只有關鍵以下幾個東西
一、業務接口:一個Interface
二、實現業務接口的類:一個繼承Interface的Class
三、自己寫一個繼承了java.lang.reflect.InvocationHandler的Handler類
四、在這個Handler類中實現invoke()方法
五、在invoke()方法中一定要記得寫return method.invoke(wrapped, args)
六、要使Handler和自己的業務接口關聯還的寫下面的代碼(一般寫在Handler類中)
以下內容為程序代碼:
public static Object newInstance(Object obj) { return java.lang.reflect.Proxy.newProxyInstance(obj.getClass() .getClassLoader(), obj.getClass().getInterfaces(),new Handler(obj)); }
| |
這樣返回的就是經過代理的對象了(把原對象和Handler綁定到一起)
dynamic proxy的典型應用《使用JAVA中的動態代理實現數據庫連接池》
dynamic proxy在JDBC上的應用
IBM文章:
《使用JAVA中的動態代理實現數據庫連接池》