首页 > 代码库 > Java动态代理的实现

Java动态代理的实现

网上看了一些关于动态代理的资料和写得好的博文,然后,为了加深印象 ,自己也比猫画虎的理解一下。

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 }
ImplUserDao接口
技术分享
 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 }
UserDaoImpl 实现类
技术分享
 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 }
UserDaoProxy代理类
技术分享
 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 }
Client测试类

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

 

Java动态代理的实现