文档章节

设计模式之Jdk动态代理

o
 osc_w9s1w4o0
发布于 2019/03/30 00:06
字数 1083
阅读 7
收藏 0

精选30+云产品,助力企业轻松上云!>>>

什么是动态代理呢?
就是在java的运行过程中,动态的生成的代理类。(为了更熟悉的了解动态代理,你必须先熟悉代理模式,可点击设计模式之代理模式 阅读)
我们知道java属于解释型语言,是在运行过程中,寻找字节码文件从而实现类加载的。
但是字节码文件并不需要一定是硬盘中的class文件,也可以是来自网络、数据库或者是直接生成的数据流。因此这就给虚拟机动态的生成代理类提供了可能。
Java 1.3 正式引入,动态代理(Dynamic proxies)特性。
前一篇文章我们已经知道Proxy是代理模式的核心,而动态代理就是在运行期间由虚拟机根据需要,动态的生成出这样一个代理类。
我们可以直接看java的实现方法:

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Proxy;
 3 
 4 public class DynamicProxyInvoker
 5 {
 6     public static void main(String[] args)
 7     {
 8         InvocationHandler proxyHandler = new SuperStarInvocationHandler("messi");
 9         ISuperStar superStarDynamicProxy = (ISuperStar) Proxy.newProxyInstance(ISuperStar.class.getClassLoader(), new Class<?>[]
10         { ISuperStar.class }, proxyHandler);
11         superStarDynamicProxy.signContract();
12         superStarDynamicProxy.negotiate();
13     }
14 }
 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 
 4 public class SuperStarInvocationHandler implements InvocationHandler
 5 {
 6     private String proxyName;
 7     ISuperStar superStar;
 8     
 9     public SuperStarInvocationHandler(String startName)
10     {
11         this.proxyName = startName + "'s proxy";
12         superStar = new SuperStar(startName);
13     }
14     
15     @Override
16     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
17     {
18         System.out.println(proxyName + " signContract");
19         Object object = method.invoke(superStar, args);
20         return object;
21     }
22     
23 }
 1 public interface ISuperStar
 2 {
 3     /**
 4      * 签约
 5      */
 6     public void signContract();
 7     
 8     /**
 9      * 谈判
10      */
11     public void negotiate();
12 }
 1 public class SuperStar implements ISuperStar
 2 {
 3     private String starName;
 4     public SuperStar(String starName)
 5     {
 6         this.starName=starName;
 7     }
 8     
 9     @Override
10     public void signContract()
11     {
12         System.out.println(starName+" signContract");
13         // to do sth
14         return;
15     }
16     
17     @Override
18     public void negotiate()
19     {
20         System.out.println(starName+" negotiate");
21         // to do sth
22         return;
23     }
24 }

superStarDynamicProxy是由系统自动生成的,一个实现了接口ISuperStar的类。这个类并不存在于具体的实现。同时由于系统也不知道我们具体需要在代理类中做哪些的操作。
因此需要我们自己提前安排好一个处理类SuperStarInvocationHandler。这个处理类中实现了代理类中是如何调用实现类中的方法的逻辑。
他们的调用关系图是这样的:


       我们可以看到动态代理的结构图中,代理方并不会直接调用到被代理方,而是通过业务处理类来调用的。因此业务处理类需要保持一个被代理方的实例对象。(非强制)通过虚拟机主动生成动态代理类,我们可以发现,调用方和被调用方在代码实现阶段其实是断层的。并不存在依次的直接调用关系。因此耦合的概念会更浅。同时由于不再需要为像静态代理那样为每个类都实现一个代理类,因此以切面的形式加入代理层成为可能。这个我会在后续的文章中介绍。

       ps :有兴趣的同学可以在main方法中手动的将动态代理生成的代理方superStarDynamicProxy的字节码导入到一个.class文件中,然后反编译该文件。你就会发现,这个类其实就是被代理方所实现接口的一个适配类。其中的所有方法的实现都是调用业务处理类SuperStarInvocationHandler,再由业务处理类通过反射动态的调用到SuperStar类的。


动态代理的不足

1、早期由于jdk反射的性能有限,因此jdk的动态代理方式在性能上并不是很优越,但是随着jdk对于反射性能的优化,此处的性能损耗已经越来越小。
2、从构建动态代理类的源码(有兴趣的同学也可以按照前文的形式反编译),或者是手动添加一个Instance Proxy的形式。
我们可以发现,代理类其实是继承自Proxy的同时实现了接口。因此动态代理只能用来解决接口动态代理的场景,因为java是不允许集成自多个类的。此问题可以使用CGLIB来解决,有兴趣的同学可以自己看下,这个我会在后边的文章中介绍。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
设计模式(一)--代理模式

设计模式是java基础中很重要的一部分,设计模式说白了就是以前的人总结出的套路,就像小说中那些武功秘籍、内功心法一样 设计模式分为三大类:   1、创建型模式(5种):工厂方法模式、抽象工...

osc_hlq50xpf
2019/06/05
1
0
漫谈设计模式(一):代理(Proxy)模式与适配器(Adapter)模式对比

1.前言 为什么要将代理模式与适配器模式放在一起来说呢?因为它们有许多的共同点,当然也有一些不同的地方。首先两者都是属于结构型模式。结构型模型是这样定义的: 结构型模式涉及到如何组合...

osc_afhuw317
2019/07/25
1
0
设计模式之代理模式【小白学这一篇就够了】

一生猿,一世猿。 目录 一、前言 二、简介 三、代理模式 - 静态代理 四、代理模式 - JDK动态代理 五、代理模式 - CGLib动态代理 一、前言 上篇 设计模式之原型模式【选用鸣人影分身阐述】得到...

猿医生
07/01
0
0
结构型设计模式在公司项目中的运用实践,超级实用

关于设计模式的一些实战总结 -- 常见的结构型设计模式 在设计模式里面,有一种叫做适配器的设计模式 Adapter Design Pattern ,这类适配器模式通常应用于做不同接口之间的适配和调整,常见的...

Java知音号
05/18
0
0
结构型设计模式在公司项目中的运用实践,超级实用

关于设计模式的一些实战总结 -- 常见的结构型设计模式 在设计模式里面,有一种叫做适配器的设计模式 Adapter Design Pattern ,这类适配器模式通常应用于做不同接口之间的适配和调整,常见的...

Java知音号
05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

深入浅出Zabbix 3.0 -- 第二章 Zabbix Web操作与定义

第二章 Zabbix Web操作与定义 本章介绍Zabbix 中一些基本概念的定义和web前端页面的操作,包括Zabbix中使用的一些术语的定义,Web页面中用户管理、主机和主机组的管理,以及监控项、模板、触...

osc_5zaxkz1e
1分钟前
0
0
深入浅出Zabbix 3.0 -- 第一章 Zabbix 安装与配置

第一章 Zabbix 安装与配置 1.1 Zabbix 介绍 Zabbix是一个企业级的开源监控软件,可以监控IT基础架构的可用性和应用的性能,为用户提供集中管理、分布式监控的一站式(all in one)监控解决方...

osc_nvkeo9cj
2分钟前
0
0
PHP 实现抽奖逻辑

public static function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr); //概率数组循环 forea......

chenhongjiang
2分钟前
0
0
struts2 上传 下载

东方部落: http://11144439.blog.51cto.com struts中上传文件功能小测试。这里jar是 2.5 版本。 项目结构图 废话不多说,直接代码。 2. web.xml配置 <?xml version="1.0" encoding="UTF-8......

osc_1qix3fyb
3分钟前
0
0
SVN管理系统安装及其操作

SVN管理系统安装及操作 防伪码:学习永远不晚! 前言: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上...

osc_afifi2qt
5分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部