Java——動態代理

來源:互聯網
上載者:User

標籤:null   soft   代理   []   img   tac   getc   sdn   invoke   


         

          在靜態代理中,我們在調用target類的時候,都是先拿到proxy類。由於proxy類中將target類作為了成員變數,而且跟target類繼承了一樣的介面,具有同樣的方法,所以,在proxy類中。通過調用target類的方法來對目標類方法的運行前後插入特殊操作。


         可是靜態代理有倆缺點:1,代理類特別多,每添加一個target類。就要寫一個代理。2,在proxy類中,可能我們須要插入的操作時同樣的。這就造成了代碼的反覆。


             所以。通過引入反射,能夠實現動態代理,以對靜態代理進行改進。



/** * @ClassName: LogHandler * @Description: 用於建立代理類 * @author 水田 * @date 2015年12月8日 上午11:17:51 */public class LogHandler implements InvocationHandler {    private Object targetObject;    public Object newProxyInstance(Object targetObj) {this.targetObject = targetObj;/* * 1,拿到類的classLoader * 2,得到建立的類的介面 * 3,傳入回調invoke方法所在類 * */return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),targetObj.getClass().getInterfaces(), this);    }    /*     * (非 Javadoc) <p>Title: invoke</p> <p>Description: </p>     *      * @param proxy     *      * @param 調用方法資訊     *      * @param args:方法的參數數組     *      * @return     *      * @throws Throwable     *      * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,     * java.lang.reflect.Method, java.lang.Object[])     */    @Override    public Object invoke(Object proxy, Method method, Object[] args)    throws Throwable {for (int i = 0; i < args.length; i++) {    System.out.println(args[i]);}try {    // 調用目標類的方法,返回一個object,假設方法沒有傳回值,則返回null    method.invoke(targetObject, args);} catch (Exception e) {    e.printStackTrace();    throw e;}System.out.println("start----->>>" + method.getName());return method.getName();    }}

       使用示範範例:


/* 動態代理示範範例 */LogHandler logHandler = new LogHandler();UserManager userManager = (UserManager) logHandler.newProxyInstance(new UserManagerImpl());userManager.addUser("2343254", "lhc");


       我們將target類中被呼叫者法運行前後要插入的操作放在回呼函數invoke方法中,當使用代理類調用相應方法的時候。會直接進入invoke方法這裡。使用method,和invoke第三個參數能夠拿到被呼叫者法的資訊。


        添加了動態代理之後。明顯去掉了靜態代理的兩個小缺點。





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.