网上看了一些关于动态代理的资料和写得好的博文,然后,为了加深印象 ,自己也比猫画虎的理解一下。
java的动态代理呢,是相对于静态代理 来说的,是为了解决 接口中多方法 所造成的 维护起来困扰 的产物。
主要实现呢,是由InvocationHandler 接口和Proxy代理 类 来完成地。
代码结构呢 ,是这样子地,接口ImplUserDao +接口实现类UserDaoImpl +代理类UserDaoProxy+测试类Client。
测试类中创建代理对象 implUserDao2 ,由代理 对象implUserDao2 通过 代理人 InvocationHandler 中的handler来找到代理类UserDaoProxy,通过 invoke()方法来实现动态代理 。 基本上呢 ,就是有事的人implUserDao2 找到 中介平台InvocationHandler中的负责人handler来调用invoke(),间接完成地。
1 public interface ImplUserDao { 2 public void print();//定义接口打印方法 3 }
1 public class UserDaoImpl implements ImplUserDao{ 2 3 /* (non-Javadoc) 4 * @see cn.fupin.dao.ImplUserDao#print() 5 */ 6 public void print() { 7 System.out.println("UserDaoImpl.print()我被打印出来了……"); 8 9 } 10 11 }
1 public class UserDaoProxy implements InvocationHandler{ 2 3 private ImplUserDao implUserDao;//定义 要代理的真实对象 4 5 //创建构造方法 ,为调用代理类时传参 6 public UserDaoProxy(ImplUserDao implUserDao) { 7 8 this.implUserDao = implUserDao; 9 } 10 11 12 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 13 //在 代理 对象 调用 真实对象时, 自动 关联 到invocationHandler 对象 来实现 动态代理 。 14 method.invoke(implUserDao, args); 15 return null; 16 } 17 18 }
1 public class Client { 2 public static void main(String[] args) { 3 //代理 的真实对象 4 ImplUserDao implUserDao = new UserDaoImpl(); 5 //创建代理 接口对象 。 没有这个handler对象,就没有 找人的感觉,何谈代理 6 //代理 的主要接口InvocationHandler ,在创建代理对象 的时候,会自动的关联到handler 对象来调用 代理类中的invoke()方法来实现代理 。 7 InvocationHandler handler = new UserDaoProxy(implUserDao); 8 9 //创建代理 对象 10 ImplUserDao implUserDao2 =(ImplUserDao) Proxy.newProxyInstance(handler.getClass().getClassLoader(), 11 implUserDao.getClass().getInterfaces(), 12 handler); 13 14 implUserDao2.print(); 15 } 16 }
invoke()方法解析
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//当代理对象 调用 真实对象的方法时,会自动的跳转到代理对象关联的 handler对象的invoke方法来进行调用
method.invoke(subject, args);
return null;
}
参数proxy,定义的是我们要代理的那个真实对象
参数method,定义的是我们要调用真实对象的某些方法
参数args,定义的是调用真实对象某个方法时接受的参数
方法解析:
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
参数 loader,一个classLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
参数interfaces,一个interface对象的数组,表示的是将要给需要代理的对象提供一组什么接口,如果我提供了一组接口给字,那么这个代理对象就宣称实现了该接口,这样我就能调用这组接口中的方法了。
参数h ,invocationHandler对象,在代理对象调用真实对象的时候,需要关联 调用invoke()方法的对象。
//代理 的主要接口InvocationHandler ,在创建代理对象 的时候,会自动的关联到handler 对象来调用 代理类中的invoke()方法来实现代理 。
InvocationHandler handler = new UserDaoProxy(implUserDao);
//创建代理 对象
ImplUserDao implUserDao2 =(ImplUserDao) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
implUserDao.getClass().getInterfaces(),
handler);
引用来自:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html