JAVA动态代理模式(从现实生活角度理解代码原理)

 更新时间:2017年03月14日 10:21:29   作者:潘侯爷  
本文主要介绍了JAVA动态代理模式(从现实生活角度理解代码原理)的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧

所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联。

java动态代理主要是使用java.lang.reflect包中的两个类。

InvocationHandler类

public Object invoke(Object obj,Method method,Object[] obs)

其中第一个参数 obj 指的是代理类,method是被代理的方法,obs是指被代理的方法的参数组。此方法由代理类来实现。

Proxy类

protectedProxy(InvocationHandler h);

staticClass getProxyClass(ClassLoader loader,Class[] interfaces);

staticObject newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandlerh);

动态代理其实是在运行时生成class,所以,我们必须提供一组interface,然后告诉他class已经实现了这些interface,而且在生成Proxy的时候,必须给他提供一个handler,让他来接管实际的工作。

同样的在开始代码实现之前,我们还是要讲一下关于链家的故事,之前静态代理模式中提到链家(接口)有卖二手房的业务,公司有一大批售房精英(静态代理),但现在互联网金融这块发展势头迅猛,链家也想插一脚进去,但苦于没有相关人才(代理)储备,这时公司便有了从相关的人才市场(动态代理“工厂”)寻找专业人才实现此类业务的想法,人才市场,顾名思义,就是根据企业(接口)的某种需求(被代理的方法)寻找有相关技能的人才。下面开始动态代理的实现代码:

第一步:LianJia提供房屋买卖以及互联网贷款渠道方法(接口

 interface LianJia {
   public void sellHouse();
   public void loan();
 }

第二步:我们的房主不仅要卖房也要贷款做其他事情(市场需求)得知链家有这个业务所以他又找到了链家(被代理对象

public class HouseMaster implements LianJia {
  @Override
  public void sellHouse() {
    System.out.println("我有房子要卖");
  }
  @Override
  public void loan() {
    System.out.println("我要贷款做生意");
  }
}

第三步:这里是浩瀚的人才市场,你想要的这里都有(生成动态代理的类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CreatProxy implements InvocationHandler{
  //声明被代理对象(之所以用Object是因为他在Java中是所有类包含自定义类的超类)
  private Object target;
  //创建代理对象(根据被代理对象需求)
  public Object bind(Object target){
    this.target = target;
    //使用Proxy类创建一个动态代理对象
    Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    return proxy;
  }
  //具体执行业务的方法
    /**
     * proxy: 代理类对象
     * method:被代理对象的方法
     * args:被代理对象方法的参数
     */
  public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    //调用业务方法
    method.invoke(target);
    return null;
  }
}

第四步:实现测试类

public class Test {
  public static void main(String[] args) {
    HouseMaster hm = new HouseMaster();
    CreatProxy cp = new CreatProxy();
    LianJia lj = (LianJia) cp.bind(hm);
    lj.sellHouse();
    lj.loan();
  }
}

我们也发现从静态代理到动态代理整个过程中发现,被代理对象(市场需求)会随时变化,企业(接口)也必须启用动态代理模式才可应对市场变化(个人认为富士康就属于一个大的电子类动态代理工厂,而苹果谷歌等企业则为市场需求的缔造者与规则(接口)的)。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • java UDP实现一个聊天工具的示例代码

    java UDP实现一个聊天工具的示例代码

    这篇文章主要介绍了java UDP实现一个聊天工具的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • SpringCloud实战小贴士之Zuul的路径匹配

    SpringCloud实战小贴士之Zuul的路径匹配

    这篇文章主要介绍了SpringCloud实战小贴士之Zuul的路径匹配,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 浅谈java中replace()和replaceAll()的区别

    浅谈java中replace()和replaceAll()的区别

    这篇文章主要介绍了java中replace()和replaceAll()的区别,两者都是常用的替换字符的方法,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • Java 并发编程之线程挂起、恢复与终止

    Java 并发编程之线程挂起、恢复与终止

    这篇文章主要介绍了Java 并发编程之线程挂起、恢复与终止的相关资料,需要的朋友可以参考下
    2017-05-05
  • Callable实现多线程步骤详解

    Callable实现多线程步骤详解

    这篇文章主要介绍了Callable实现多线程步骤详解,Callable是一个接口,用于实现多线程,与实现Runnable类似,但是功能更强大,该方法可以在任务结束后提供一个返回值,需要的朋友可以参考下
    2023-10-10
  • itext生成PDF设置页眉页脚的实例详解

    itext生成PDF设置页眉页脚的实例详解

    这篇文章主要介绍了itext生成PDF设置页眉页脚的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • IDEA SSM整合Redis项目实例 附源码

    IDEA SSM整合Redis项目实例 附源码

    今天给大家普及IDEA SSM整合Redis项目实例,包括pom.xml 配置和spring-redis.xml 配置代码,代码也很简单,通过项目实际案例能更好的帮助大家理解,需要的朋友可以参考下
    2021-06-06
  • Java Stream map, Collectors(toMap, toList, toSet, groupingBy, collectingAndThen)使用案例

    Java Stream map, Collectors(toMap, toLis

    这篇文章主要介绍了Java Stream map, Collectors(toMap, toList, toSet, groupingBy, collectingAndThen)使用案例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • java实现简单的英文文本单词翻译器功能示例

    java实现简单的英文文本单词翻译器功能示例

    这篇文章主要介绍了java实现简单的英文文本单词翻译器功能,涉及java文件读取、字符串分割、遍历、判断等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Java面向对象之抽象类,接口的那些事

    Java面向对象之抽象类,接口的那些事

    这篇文章主要介绍了Java面向对象基础:抽象类和接口,文中代码可以帮助各位更好的理解学习,有需求的小伙伴可以参考下,希望能够给你带来帮助
    2021-08-08

最新评论