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