[學習資料來自尚學堂公布之視頻]
[前面已經轉了幾篇有關靜態/動態代理的帖子.寫的都很不錯.自己也跟著視頻敲了幾篇代碼.
現在貼出來.算是有有始有終吧.]
1.UserManager接口
 1package com.zyl.proxy;
 2
 3public interface UserManager {
 4    
 5    public void addUer(String name,String password);
 6    
 7    public void delUser(String id);
 8    
 9    public void modifyUser(int id, String name, String password);
10    
11}

12
2.實現接口的UserManagerImpl類
 1package com.zyl.proxy;
 2
 3public class UserManagerImpl implements UserManager {
 4
 5
 6    public void addUer(String name, String password) {
 7       //添加日志/安全性檢查
 8        //checksafe();
 9        //采用添加代理類的方法會如何?
10        System.out.println("UserManagerImpl.addUser()123");
11
12    }

13
14    @Override
15    public void delUser(String id) {
16        //添加日志/安全性檢查
17        //checksafe();
18           System.out.println("UserManagerImpl.delUser()");
19    }

20
21    @Override
22    public void modifyUser(int id, String name, String password) {
23        //添加日志/安全性檢查
24        //checksafe();
25           System.out.println("UserManagerImpl.modifyUser()");
26
27    }

28//    private void checksafe(){
29//        System.out.println("檢查安全性的方法");
30//    }
31}

32
注釋的地方不用理會
3.動態代理的類safeHandler
 1package com.zyl.proxy;
 2
 3import java.lang.reflect.InvocationHandler;
 4import java.lang.reflect.Method;
 5import java.lang.reflect.Proxy;
 6
 7public class safeHandler implements InvocationHandler //實現InvocationHandler接口
 8    
 9    private Object targetObj;
10    public Object newProxy(Object targetObj){
11        this.targetObj=targetObj;
12        //生成動態代理::
13        //對象的接口等ooxx
14        return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),targetObj.getClass().getInterfaces(),
15                this);//targetObj.getClass().getInterfaces()的傳入,所以只要實現了接口的類都會被動態代理
16        
17    }

18    public Object invoke(Object proxy, Method method, Object[] args)//args是傳遞過來的參數,比如name為張三
19            throws Throwable 
20        //調用任何方法前都會前調用invoke方法,所以我們在invoke方法前放置需要調用的代碼 如安全性檢查/log日志等等添加的方法
21        //這里還可以加入一些邏輯判斷,是否加入安全性檢查
22        checksafe();
23         System.out.println("方法名是"+method.getName());
24         for(int i=0;i<args.length;i++){
25             System.out.println("哈哈"+args[i]);
26         }

27         //臨時添加方法調用結束
28         //以下調用一般的方法
29        Object result=null;
30        
31        try{
32            method.invoke(targetObj,args); //真正的調用對象的實現的方法(非添加的那些方法)
33        }
catch(Exception e){
34            e.printStackTrace();
35        }

36        return result; //invoke方法需要返回一個對象.所以前面定義了一個Object result=null; 這里返回result
37    }

38    //將要加入的安全性檢查等等類似的方法放在此類中
39    private void checksafe(){
40        System.out.println("檢查安全性的方法");
41    }

42
43}

44
4.client端:
 1package com.zyl.ooxx;
 2
 3import com.zyl.proxy.UserManager;
 4import com.zyl.proxy.UserManagerImpl;
 5import com.zyl.proxy.safeHandler;
 6
 7
 8public class client {
 9
10    public static void main(String[] args) {
11        safeHandler handler=new safeHandler();//建立代理類的實例
12        UserManager usermanager=(UserManager)handler.newProxy(new UserManagerImpl());//傳入代理對象轉成原接口類型
13        usermanager.addUer("實際是調用代理的方法""2222");//調用代理中的東西,然后再調用代理對象的ooxx
14       
15    }

16
17}

18
就到這里吧.學習spring aop的基礎差不多打好了