動態代理與子類代理
阿新 • • 發佈:2017-09-05
llb ram 9.png str width row and lib cal
1.動態代理
java.lang.reflect.Proxy 對象 幫我們生成一個代理對象來完成這個記錄日誌的工作動態代理:被代理的對象一定要實現接口 loader: 類加載器,跟被代理對象(UserDao)一致即可 interfaces: 被代理對象的接口列表 h這個參數: 傳入的是這個接口的實現類
動態生成的子類
1 //使用動態代理工具生成代理對象 2 public class DynamicProxyUtil { 3 /** 4 * 獲取動態代理對象 5 * @param obj 目標對象 6 * @return 代理對象7 */ 8 public static Object getProxyObj(final Object obj){ 9 return Proxy.newProxyInstance( 10 //獲取類加載器 11 obj.getClass().getClassLoader(), 12 //獲取接口列表 13 obj.getClass().getInterfaces(), 14 //增強的功能在這裏 15 new InvocationHandler() {16 /** 17 * proxy :代理對象 18 * method:方法 19 * args:參數列表 20 */ 21 @Override 22 public Object invoke(Object proxy, Method method, Object[] args) 23 throws Throwable { 24//記錄日誌 25 System.out.println("記錄日誌了......."); 26 //回調目標對象的方法 27 /* obj:目標對象 28 * args: 參數列表 29 */ 30 method.invoke(obj, args); 31 return null;
2.子類代理
子類也是一種增強的方式 通過第三方的工具來實現子類代理: Cglib Enhancer類來幫我們生成子類的代理 1)導jar包,我們spring的ioc包中已經集成cglig的包
1 //子類代理 2 public class SubProxyUtil { 3 /** 4 * 通過這個方法生成被代理對象的子類 5 * @param obj 6 * @return 7 */ 8 public static Object getSubProxyObj(final Object obj){ 9 //通過cglig的工具類生成子類的代理對象 10 Enhancer en = new Enhancer(); 11 //傳入父類 12 en.setSuperclass(obj.getClass()); 13 //做增強,回調 14 en.setCallback(new MethodInterceptor() { 15 //這個方法就是做的增強 16 /** 17 * arg0 :代理對象 18 * Method:被代理對象的方法 19 * arg2:參數列表 20 * MethodProxy:代理對象的方法 21 */ 22 @Override 23 public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { 24 25 if(arg1.getName().equals("save")){ 26 //增強 27 System.out.println("記錄日誌了:"+arg1.getName()); 28 } 29 //回調 30 /* 31 * obj:傳入被代理的對象 32 * arg2:方法中使用的參數 33 */ 34 arg1.invoke(obj, arg2); 35 return null; 36 } 37 }); 38 //返回被代理對象的子類 39 return en.create(); 40 /* 子類代理:幫我們完成記錄日誌的工作 41 */ 42 //被代理的對象 43 UserDaoImpl2 userdao = new UserDaoImpl2(); 44 //返回的子類 45 UserDaoImpl2 proxy = (UserDaoImpl2)SubProxyUtil.getSubProxyObj(userdao); 46 proxy.save(); 47 proxy.update();
動態代理與子類代理