zoukankan      html  css  js  c++  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

  • 相关阅读:
    《2048》开发5——实现计分功能
    《2048》开发4——继续编辑GameView类,实现游戏逻辑
    《2048》开发3——编辑Card类
    robotframework(rf)中对时间操作的datetime库常用关键字
    弹框和单选框,复选框
    Selenium IDE安装与使用
    全面的功能测试点总结
    RF新手常见问题总结--(基础篇)
    常用断言关键字(rf中)
    jmeter录制(ios)app脚本
  • 原文地址:https://www.cnblogs.com/shuanlei/p/4253232.html
Copyright © 2011-2022 走看看