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