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

发布时间 - 2026-01-11 00:09:54    点击率:

所谓动态代理,即通过代理类: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  # 动态代理  # Java简单实现动态代理模式过程解析  # Java代理模式实例详解【静态代理与动态代理】  # Java动态代理模式的深入揭秘  # Java设计模式之动态代理模式实例分析  # java 代理模式及动态代理机制深入分析  # 详解java动态代理模式  # java代理模式与动态代理模式详解  # 代理模式之Java动态代理实现方法  # Java代理模式与动态代理之间的关系以及概念  # 链家  # 市场需求  # 互联网  # 人才市场  # 要卖  # 有一  # 我要  # 是在  # 都有  # 是因为  # 第一个  # 他在  # 也要  # 我有  # 给他  # 是指  # 他又  # 此类  # 自定义  # 一脚 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何生成URL和重定向?(路由助手函数)  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  php 三元运算符实例详细介绍  Laravel怎么连接多个数据库_Laravel多数据库连接配置  如何基于云服务器快速搭建网站及云盘系统?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  敲碗10年!Mac系列传将迎来「触控与联网」双革新  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何在IIS中新建站点并解决端口绑定冲突?  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  北京网站制作公司哪家好一点,北京租房网站有哪些?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  如何快速生成专业多端适配建站电话?  如何自定义建站之星网站的导航菜单样式?  什么是javascript作用域_全局和局部作用域有什么区别?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  详解jQuery中的事件  Laravel如何自定义分页视图?(Pagination示例)  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  简单实现Android文件上传  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel如何保护应用免受CSRF攻击?(原理和示例)  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  清除minerd进程的简单方法  Laravel中的Facade(门面)到底是什么原理  javascript读取文本节点方法小结  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  zabbix利用python脚本发送报警邮件的方法  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何用花生壳三步快速搭建专属网站?  nodejs redis 发布订阅机制封装实现方法及实例代码