javaSE复习之-------------------动态代理

Isaacgym使用操作指南 Isaac Gym 是一个强大的仿真工具,特别适合那些需要进行大规模并行仿真和训练的机器人和强化学习任务。通过 GPU 加速、深度学习集成和丰富的物理仿真能力,Isaac Gym 能够显著提高仿真和训练效率,是机器人学和 AI 研究中的一大利器。 阅读详情

代理模式一般涉及到的角色有:
–抽象角色:声明真实对象和代理对象的共同接口
–代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
–真实角色:代理角色所代表的真实对象,是我们最终要引用的对象

在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

一、静态代理:

抽象角色:

public interface Subject {
    
    public void doSomething();
}

真实角色:

复制代码
public class RealSubject implements Subject {
    @Override
    public void doSomething() {
        
        System.out.println("do something!");
    }
}
复制代码

代理角色:

复制代码
public class PoxySubject implements Subject{
    private RealSubject subject;
    
    @Override
    public void doSomething() {
        this.doPreThing();
        
        if (null == subject) {
            
            subject = new RealSubject();
        }
        
        subject.doSomething();
        this.dopostThing();
    }
    
    public void doPreThing() {
        System.out.println("pre things");
    }
    
    public void dopostThing() {
        System.out.println("post things");
    }
}
复制代码

测试类(main方法)

复制代码
public class Client {
    /**
     * 静态代理模式 作用是为其他对象提供一种代理以控制对这个对象的访问。
     * 在本例中的作用是我们不仅可以完成doSomething()方法,而且还可以控制在这个方法前后我们再另外做一些事情。
     * @param args
     */
    public static void main(String[] args) {
        Subject subject = new PoxySubject();
        subject.doSomething();
    }
}


    我们发现通过这种方式,我们隐藏了真实角色而是通过代理角色完成了真实角色所做的事情。并且我们可以在代理角色中做一些手脚实现一些我们自己想实现的方法。这就是静态代理的作用。但是很快我们发现其中的局限性。

    如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这就是静态代理的局限性,这个问题可以通过Java的动态代理类来解决。

二、动态代理

Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类:

(1)Interface InvocationHandler:该接口中仅定义了一个方法
-public object invoke(Object obj,Method method, Object[] args)
在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。


(2)Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容

-protected Proxy(InvocationHandler h):构造函数,用于给内部的h赋值。
-static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
-static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)

接下来我们用动态代理实现之前的例子

抽象角色:

public interface Subject {
    public void doSomething();
}

真实角色:

public class RealSubject implements Subject {

    public void doSomething() {
        System.out.println("from real subject");
    }
}

实现代理角色的类:

复制代码
public class DynamicSubject implements InvocationHandler {
    
    private Object sub;
    
    public DynamicSubject(Object obj) {
        this.sub = obj;
    }
 
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("调用之前" + method);
        
        method.invoke(sub, args);
        
        System.out.println("调用之后" + method);
        
        return null;
    }    
}
复制代码

测试类(main方法):

复制代码
public class Client {
    
    public static void main(String[] args) {
        RealSubject sub = new RealSubject();
        InvocationHandler hanlder = new DynamicSubject(sub);
        
        //返回代理类的一个实例
        Subject subject =(Subject)Proxy.newProxyInstance(hanlder.getClass().getClassLoader(), sub.getClass().getInterfaces(), hanlder);
        subject.doSomething();
    }
}
复制代码

运行结果:


我们还是实现了静态代理所实现的功能,而且我们的程序有了更好的可扩展性。我们可以通过这种方式代理不止一个类,而是多个只要这个类实现了上层接口,更为关键的是这一切是动态生成的,显然这是利用了java的反射技术。这样的话动态代理就可以做很多事情了,最经典的就是spring框架中依赖注入,有兴趣的童鞋可以深入去看看源代码。

所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。

实现动态代理的步骤:

1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法
2.创建被代理的类以及接口
3.通过Proxy的静态方法
newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 创建一个代理
4.通过代理调用方法

通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系。



ENU坐标系实战:5分钟搞定无人机导航中的站心坐标转换 本文针对无人机导航中GPS坐标与视觉感知不匹配的定位漂移问题,提供了基于ENU坐标系的实战解决方案。通过Python代码演示了如何快速、精准地实现地心地固坐标与站心坐标之间的转换,并详细解释了转换原理、精度对比及工程优化技巧,帮助开发者从根本上解决局部相对定位不准的难题。 阅读详情

相关推荐

Win10家庭版中文用户名改英文全攻略:从注册表到环境变量一步不落

本文详细介绍了Windows 10家庭版中文用户名改为英文的完整流程,包括注册表编辑、环境变量调整等关键步骤。通过激活管理员账户、重命名用户文件夹、修改注册表键值等操作,彻底解决因中文路径导致的软件兼容性问题,并提供常见错误解决方案和系统维护建议。

weixin_29227425的博客 427

git 远程库命令

  git 常用命令在这里就不在说了,初学者点击http://www.cnblogs.com/Vdiao/p/5267250.html   Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中...

diaocaohui5613的博客 181

富士SC2022,C325,C328打印机扫描到网络详细教程

富士打印机SC2022,C328,C325等型号扫描到电脑教程

weixin_41926602的博客 1万+

阿里云centOS6 下python安装及配置、pip安装及配置、ipython安装及配置

我是在阿里云服务器上进行的python环境搭建,阿里云服务器会自带python但是版本低,所以打算自己安装一个,期间遇到各种问题,而且百度根本不够用无奈上的外网很快解决了。在此分享一下。 一、python环境 首先安装python,我习惯用源码安装的方式,下面是官方下载链接: https://www.python.org/downloads/ 我是用WinSCP软件把下载好的压缩...

diaocaohui5613的博客 215

解决nfs挂载根文件系统报错:VFS: Unable to mount root fs via NFS, trying floppy.

解决nfs挂载根文件系统报错的问题:VFS: Unable to mount root fs via NFS, trying floppy.

汉尼拔勇闯天涯 4574

【保姆级教程/代码】GNSS反演大气可降水量(Precipitable Water Vapor, PWV)

GPS精密单点定位(PPP)是一种采用精密卫星星历和卫星钟差进行非差单点定位的方法,在观测过程中采用双频载波相位观测法以确保高精度定位精度。本文利用PPP技术来求解天顶对流层延迟(zenith tropospheric delay,ZTD)。ZTD由湿延迟(ZWD)和干延迟(ZHD)组成,其中占比90%的ZHD与地面测站高程、大气压和测站纬度等参数有良好的相关性,可以通过Saastamoinen模型精确求出;

weixin_43910227的博客 2925

什么是脚本语言?什么是解释性语言?什么是编译性语言?

  首先脚本语言,之前虽然一直嘴上说脚本语言但是对他并没有一个很清楚的概念。然后在网上查了一下也问了一下师傅刘哥,脚本语言开始就是用来“批量式”的执行命令。你在一个文件里把命令都写进去,然后执行这个文件。可是不久人们就发现,这些命令行其实可以用更加聪明的方法构造,比如定义一些变量,或者根据系统类型的不同执行不同的命令。于是,人们为这脚本语言加入了变量,条件语句,数组,等等构造。“脚本语言...

diaocaohui5613的博客 275

西门子200SMART自定义库开发实战:从PID到露点算法的工业应用

本文详细介绍了西门子200SMART自定义库开发实战,涵盖从PID控制到露点算法的工业应用。通过代码封装技巧、多语言支持和性能优化等高级开发方法,帮助工程师提升PLC编程效率。文章特别强调了自创库在实际项目中的优势,如恒温恒湿控制系统的成功案例,展示了自定义库在工业自动化中的强大应用价值。

lake5的博客 1026

javase基础回顾(三) 动态代理

动态代理是大型框架中经常用到的经典的技术之一,博主在理解spring的控制反转(依赖注入)的思想时回头着重复习了一下java的动态代理。 在说动态代理之前我们先简单说一说代理是用来干什么的,用于什么样的业务场景然后在引入静态代理和动态代理。 代理模式一般涉及到的角色有–抽象角色:声明真实对象和代理对象的共同接口–代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同...

diaocaohui5613的博客 175

DP_AUX辅助通道介绍

DisplayPort(简称DP)是一个由PC及芯片制造商联盟开发,视频电子标准协会(VESA)标准化的数字式视频接口标准。其中辅助通道(AUX)是一条独立双向半双工的传输通道,它也是一对差分信号线。其数据传输速率1Mbps,用来传输配置参数与指令。

cjie221的博客 5352

三菱FX5U气缸控制功能块(完整ST源代码+示例程序)

如果机器包含100个气缸,我们只需要修改数组的元素数量就可以了,效率非常的高。待续....博途PLC 面向对象系列之“双通气缸功能块“(SCL代码)_plc面向对象-优快云博客文章浏览阅读667次。本文介绍了博途PLC中面向对象编程的应用,重点讲解了双通气缸的功能块设计,包括双通电磁阀功能块、双通气缸的UDT数据类型以及SCL代码实现。同时,对比了双通与单通电磁阀的差异,并讨论了将单通气缸改造为双通气缸的方法,强调了双通气缸在安全性上的优势。

RXXW_Dor的博客 1028

JavaSE重点复习

JavaSE回顾 一、 Object1 方法1.1 boolean equals(Object obj)1.2 hashCode1.3 fianlize1.4 clone2 实体定义企业级规则二、 集合1 Collection1.1 List1.2 Set2 Map3 java.util.concurrent.*三、 IO1.分类2 Stream3 Reader|Writer4 Object流四...

时间静止 7437

c#算法(5)—最小二乘法(二次曲线拟合)

最小二乘法——二次曲线拟合

qq_34059233的博客 1659

JavaSE[本人复习SE时的记录,适合已经学习完JavaSE的朋友复习回顾]

00基本语法文档注释变量分类运算符流程控制数组 文档注释 ①文档注释用javadoc来解析,在Dos中输入一下命令 ②javadoc -d (要生成的)文件夹的名字 -author -version 文件名(.java结尾的文件名) ③执行完命令后,会在当前的目录下创建一个文件夹,其中的index.html即为该程序的说明文档 变量分类 运算符 流程控制 数组 ...

ZZWDN_旺小白的博客 3082

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JavaSE 总复习:语法到多线程全梳理

JavaSE 高效复习指南(150字摘要) 本文提出结构化复习JavaSE的方法,强调从问题解决角度切入而非死记API。将JavaSE划分为12个核心模块,每个模块明确其解决的问题:基础语法构建代码基础,面向对象组织代码结构,集合管理数据,IO处理文件读写,多线程实现并发等。复习重点包括:掌握最小实现代码、识别常见错误、设计自测方案。特别提醒关注面向对象、集合、IO和多线程等核心模块,同时注意JDK版本差异。文章采用"问题导向+代码实践"的方式串联知识点,并提供详细笔记链接供深入查阅。 (150字)

一个持续进化的java+ai学习者博客:AI Agent 工具链(Codex、Harness、Claude Code、MCP、Skills)实战笔记 + 后端开发教程,每周稳定更新。 4897

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

《JavaSE快速复习笔记》

默认比较对象内存地址,若需比较对象内容(值相等),必须重写该方法。:类型安全、代码复用、减少强制类型转换。:保证变量可见性,禁止指令重排序。:上界通配符(T及其子类)。:下界通配符(T及其父类)。:无界通配符(任意类型)。:保证多线程操作的有序性。)中对象能正确存储。(处理二进制数据)。

Ynchen. ~的博客 990

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JavaSE复习(二)

目录: 1、Java中的反射 1.1、说说对Java中反射的理解 2、Java中的动态代理 2.1、写一个ArrayList的动态代理类 2.2、动静态代理的区别,什么场景使用? 3、Java中的设计模式&回收机制 3.1、你说知道的设计模式有哪些? 3.2、单例设计模式 3.3、工厂设计模式 3.4、建造这模式(Builder) 3.5、适配器设计模式 3.6、装...

myroncham的博客 820

JavaSE基础补充+JVM学习复习总结记录

JavaSE基础进阶+JVM学习复习总结记录1. JavaSE基础进阶1.1 多线程其他 1. JavaSE基础进阶 1.1 多线程 Thread类继承 Runnable接口实现 (利用Runnable描述多个线程操作的资源,而Thread描述每一个线程对象) Callable接口实现 (Callable在JDK1.5之后提出的,Callable重写的call()方法可以有返回值,Runnable重写的run()方法无返回值) 多线程常用操作方法 // 线程休眠 Thread.sleep() (加try

Xiaobaiforgod的博客 732

JAVASE复习

创建对象时数组还没创建,添加第一个对象的时候数组才创建。

qq_75119509的博客 523

javase复习——代理模式

概述 代理模式的作用是:为其他对象提供一种以控制对方的访问。 在某种情况下,一个客户不想或者不能直接引用另一个对象可以在客户端和目标对象直接起到中介的作用。 代理的角色: 抽象角色,声明真实对象和代理对象的共同接口 代理角色,代理对象角色内部含有对真实对象的引用,从而可以操纵真实的对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象,同时代理对象可以在执行真实对象操作时,附加...

ww0peo的博客 208

javaSE复习

javase复习

Y734493585的博客 933

JavaSE 拾遗(0)——JavaSE 主线

写 javase 拾遗的主要目的是总结最近一小段时间对 javase 的学习。

分享美好的专栏 2739

Javase复习

Javase复习 一、面向对象的特征 抽象 继承 封装 多态性 二、final、finally、finalize的区别? final:修饰类、修饰方法、修饰变量 finally:finally作为异常处理的一部分,它只能用在try/catch中,并且附带一个语句块,表示这段语句最终一定被执行。 finalize:finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这个方法。这个方法在gc启动,该对象被回收时候调用。 三、int 和 Integer 有什么区别?

qq_40708522的博客 207

【系统学习】【Java基础】0-JavaSE笔记索引

什么是IOIO分类各IO的究极父类类1-1字节流、字符流类1-2字节缓冲流、字符缓冲流类1-3字节打印流、字符打印流类2转换流类3-1序列化流、反序列化流类3-2压缩流、解压缩流。

HMTeen 162

Java面试宝典书籍-JavaSE高级

JavaSE高级 (注:知识都来源于Java面试宝典书籍,此处只为学习) 一、Java中的反射 1. 理解 反射是首先能够获取到java中要反射类的字节码,然后将字节码中的方法、变量、构造函数等映射成相应的Method、Filed、Constructor等类。 获取字节码方式: Class.forName(className) 类名.class this.getClas...

qq_28400629的博客 786

JDK动态代理

这几天在复习javase,复习到了从前令人头疼的动态代理。动态代理确实是一块难啃的骨头,抽象难理解,所以还是将他记录下来,以便忘记的时候迅速回忆 //创建一个接口 interface Person{ void hobby(); void eat(); } @Override public void eat() { System.out.println("我爱吃海鲜"); ...

zb199738的博客 167
上一篇: java多线程学习之------------------Executor线程池框架
下一篇: springcloud入门
it_monkey_ali
博客等级 码龄10年 32粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值