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

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾 f作者: 寒小阳 &&龙心尘 时间:2015年10月。 出处: 声明:版权所有,转载请注明出处,谢谢。手把手机器学习之逻辑回归应用——Kaggle泰坦尼克之灾1.引言先说一句,年末双十一什么的一来,真是非(mang)常(cheng)欢(gou)乐(le)!然后push自己抽出时间来写这篇blog的原因也非常简单: 写完前两篇逻辑回归的介绍和各个角度理解之后,小伙伴们纷纷表示『好像很高级的样纸, 阅读详情

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

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

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

一、静态代理:

抽象角色:

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类)也可以动态改变,从而实现了非常灵活的动态代理关系。



virtuoso--DFF 27-实验课-std_cell2 阅读详情

相关推荐

Air780E模组AT指令实战:5分钟搞定MQTT连接EMQX服务器(附完整代码)

本文详细介绍了如何使用Air780E 4G模组通过AT指令快速连接MQTT服务器。从硬件接线、网络注册到MQTT连接配置,提供了完整的实战步骤和代码示例,帮助开发者快速实现物联网设备的数据上报与远程通信。

wdx012345的博客 743

git 远程库命令

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

diaocaohui5613的博客 181

黑群晖DSM7.0.1物理机安装教程

使用芯片无忧工具,查看U盘的和。使用,格式化U盘。使用镜像写入工具,把引导写入U盘。修改文件,可以使用工具把文件复制到桌面,通过修改好之后,拖进这个界面中。或者在电脑中,查看U盘,打开U盘中的文件直接修改。具体修改内容如下:PID修改为U盘的PIDVID修改为U盘的VID默认只有mac1=a8412083CB52 mac2=0a11323D47F7 ,增加:mac3=a15823C08000 mac4=a23C04158B52 mac5=82a002524158 mac6=38233052415aS

JingLisen的博客 2万+

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

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

diaocaohui5613的博客 215

机场数据治理系列介绍(1):机场行业数据中台中的数据管理顶层设计方案

民航机场行业的数据中台中,有关数据管理顶层设计方案需要结合机场行业的业务特点和技术需求进行具体的设计,今日我们简要考量设计提供一个参考方案:

机场信息系统研究员的专栏 1604

Windows 10/11一键搞定HDF5文件查看:HDFView 3.4.1免配置安装指南(附中文路径避坑技巧)

本文详细介绍了HDFView 3.4.1在Windows 10/11上的免配置安装方法及中文路径优化技巧。作为HDF5文件查看的专业工具,HDFView 3.4.1简化了安装流程,提升了科研数据处理效率,特别适合遥感、气象等领域的研究人员使用。

qsc9012345的博客 1146

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

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

diaocaohui5613的博客 275

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体(UI、模型等)

leoysq的博客 2560

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

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

diaocaohui5613的博客 175

李航《统计学习方法》课后习题答案(第2版)

李航《统计学习方法》课后习题答案(第2版) 章节 链接 第1章 统计学习及监督学习概论 点击进入 第2章 感知机 点击进入 第3章 k近邻法 点击进入 第4章 朴素贝叶斯法 点击进入 第5章 决策树 点击进入 第6章 逻辑斯谛回归与最大熵 点击进入 第7章 支持向量机 点击进入 第8章 提升方法 点击进入 第9章 EM算法及其推广 点击进入 第10章 隐马尔可夫模型 点击进入 第11章 条件随机场 点击进入     也可进入我的个人主页查看分类专栏

weixin_43646592的博客 2万+

“探索thumbdata4文件的奥秘:编程中的神秘存在“

综上所述,thumbdata4文件在编程中是一个常见的存在,与图库应用程序和图片浏览器密切相关。通过使用适当的库和工具,我们可以读取和处理thumbdata4文件中的缩略图数据,以提供更好的用户体验。我们首先读取8字节的块头,其中包含了下一个缩略图块的大小。你可以根据自己的需求来定义对块数据的处理方式,例如将其保存为图像文件或进行其他的分析操作。thumbdata4文件通常以二进制格式存储,其中包含着设备上浏览过的图片的缩略图。因此,你可能需要根据具体的thumbdata4文件结构进行适当的解析和处理。

JieLun_C的博客 792

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

华为OD面试八股真题 - 操作系统 - 1

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 1640

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

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

ZZWDN_旺小白的博客 3083

老版QQ原生表情gif动态

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

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

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《JavaSE快速复习笔记》

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

Ynchen. ~的博客 990

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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的博客 959

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、付费专栏及课程。

余额充值