1. 程式人生 > >動態代理與子類代理

動態代理與子類代理

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包,我們springioc包中已經集成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();

技術分享

動態代理與子類代理