Java反射 - 3(动态代理)

动态代理是对包装模式的升级,可以动态的传入需要代理的对象实现代理

准备如下

1. 被代理类的接口

2.被代理类

3.处理器:InvocationHandler

4.代理调用:Proxy.newInstance

1 /**
2  * 这是被代理的类的第一个接口
3  * Created by yesiming on 16-11-21.
4  */
5 public interface UserDao {
6     public void insert(String name);
7     public String getUser(String name);
8 }
1 /**
2  * 这是被代理的类的第二个接口
3  * Created by yesiming on 16-11-21.
4  */
5 public interface HumanDao {
6     public void insertId(int i);
7 }
 1 package o2.impl;
 2 
 3 import o2.HumanDao;
 4 import o2.UserDao;
 5 
 6 /**
 7  * 这是被代理的类
 8  * Created by yesiming on 16-11-21.
 9  */
10 public class UserDaoImpl implements UserDao, HumanDao {
11 
12     public void insert(String name) {
13         System.out.println("插入User");
14     }
15 
16     public String getUser(String name) {
17         System.out.println("获取User");
18         return "得到" + name;
19     }
20 
21     public void insertId(int i) {
22         System.out.println("id是:" + i);
23     }
24 }
 1 package o2;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 
 6 /**
 7  * 1.这是处理器,用来执行被代理类的方法
 8  * 2.通过构造函数传入被代理类的对象
 9  * 3.通过反射执行方法(method调用invoke)
10  * Created by yesiming on 16-11-21.
11  */
12 public class MyInvocationHandler implements InvocationHandler {
13 
14     private Object object;
15 
16     public MyInvocationHandler(Object object) {
17         this.object = object;
18     }
19 
20     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
21         System.out.print("开始执行...");
22         Object obj = method.invoke(object, args);
23         return obj;
24     }
25 }
 1 package o2;
 2 
 3 import o2.impl.UserDaoImpl;
 4 
 5 import java.lang.reflect.InvocationHandler;
 6 import java.lang.reflect.Proxy;
 7 
 8 /**
 9  * Created by yesiming on 16-11-21.
10  */
11 public class ProxyDemo {
12 
13     public static void main(String[] args) throws Exception{
14         // 需要用到类加载器
15         ClassLoader loader = ClassLoader.getSystemClassLoader();
16         // 被代理类实现的接口列表
17         Class[] interfaces = {UserDao.class, HumanDao.class};
18         UserDao ud1 = new UserDaoImpl();
19         // 创建处理器
20         InvocationHandler handler = new MyInvocationHandler(ud1);
21         // 通过Proxy执行,需要参数:类加载器,接口列表,处理器
22         Object ret = Proxy.newProxyInstance(loader, interfaces, handler);
23         ((UserDao)ret).insert("yesiming");
24         String str = ((UserDao)ret).getUser("yesiming");
25         System.out.println(str);
26         ((HumanDao)ret).insertId(1);
27     }
28 }

执行结果如下:

开始执行...插入User
开始执行...获取User
得到yesiming
开始执行...id是:1

 

posted on 2016-11-21 15:51  iTown  阅读(185)  评论(0编辑  收藏  举报

导航