[学习资料来自尚学堂公布之视频]
[前面已经转了几篇有关静态/动态代理的帖子.写的都很不错.自己也跟着视频敲了几篇代码.
现在贴出来.算是有有始有终吧.]
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的基础差不多打好了