java動態代理工廠類

來源:互聯網
上載者:User

package com.czp.util;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 代理產生工廠,要求其子類實現before(...),after(...),onException(...) 實現處理業務 *  * @author caozhongping *  */public abstract class ProxyFacty<T> implements InvocationHandler {private T target;public ProxyFacty(T target) {super();this.target = target;}/** * 建立代理,如果目標類沒有實現介面則返回自己 *  * @param target * @return */@SuppressWarnings("unchecked")public T getProxy() {Class<T> cls = (Class<T>) target.getClass();if (cls.getInterfaces() != null) {return (T) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(), this);}return target;}/*** * 通過代理實現調用 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object obj = null;try {before(args);obj = method.invoke(target, args);after(args);} catch (Exception e) {onException(e);}return obj;}/*** * 出現異常時處理 *  * @param ex */public abstract void onException(Exception ex);/** * 調用方法後處理 *  * @param args */public abstract void after(Object[] args);/** * 調用方法前處理 *  * @param args */public abstract void before(Object[] args);}//目標對象的介面package com.czp.util;public interface TestItf {void say(String name)throws Exception;}//目標對象package com.czp.util;public class TestItfImpl implements TestItf {@Overridepublic void say(String name) throws Exception {if(name==null)throw new Exception("name is null");System.out.println("Hell, "+name);}}//代理工具類,繼承工廠類實現攔截package com.czp.util;public class ProxyUtil<T> extends ProxyFacty<T>{public ProxyUtil(T target) {super(target);}@Overridepublic void onException(Exception ex) {System.out.println("call Method error:"+ex);}@Overridepublic void after(Object[] args) {System.out.println("----------exit method-----------");}@Overridepublic void before(Object[] args) {System.out.println("-----Enter method------");}    public static void main(String[] args) throws Exception {    TestItf target = new TestItfImpl();//目標對象TestItf proxy = new ProxyUtil<TestItf>(target).getProxy();//目標的代理執行個體proxy.say("WengJiaBao");//正常調用//異常調用proxy.say(null);}}//輸出:-----Enter method------Hell, WengJiaBao----------exit method----------------Enter method------call Method error:java.lang.reflect.InvocationTargetException

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.