文章目录

  • Java 进阶(三)动态代理
    • 代理模式
      • 定义
      • 作用
    • 静态代理
    • 动态代理

Java 进阶(三)动态代理

要想学习动态代理,首先我们得了解一下代理模式。

代理模式

定义

代理模式给某一个对象提供代理对象,并由代理对象控制对原对象的引用。

举个例子,tx想用游戏赚钱,但是自己又设计不出好的游戏,于是跟拳头公司协商,拿下LoL中国区的代理。这样tx就不用再去关心新英雄新皮肤的设计、游戏更新等等问题,只需要关心英雄和皮肤怎么卖才赚钱就行了(狗头保命)。

作用

那么为什么要用代理模式呢?
还是回到刚刚的栗子,tx拿到代理权后解决了两个事情:1.tx不用关心游戏设计中等等的问题 2.tx也可以开展自己擅长的业务(卖皮肤)
所以归纳一下,
1.中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
2.开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。

静态代理

静态代理和动态代理的区别在于代理的创建时期。
静态代理是由程序员创建或特定工具自动生成源代码,在程序运行之前,代理类就已经被创建了。
而动态代理是在程序运行时通过反射机制动态创建的。关于反射,请关注我专栏的其他博客。

静态代理的创建比较简单:

// 服务接口
public interface LoL {void developLoL();
}
// 委托类
public class tencent implements LoL {@Overridepublic void developLoL() {System.out.println("卖英雄");System.out.println("卖皮肤");}
}
// 代理类
public class Roit implements LoL{private tencent tx;public Roit(final tencent tx){this.tx = tx;}@Overridepublic void developLoL() {System.out.println("设计新英雄");System.out.println("平衡性调整");tx.developLoL();}
}
// 测试
public class test {public static void main(String[] args) {tencent tx = new tencent();tx.developLoL();Roit r = new Roit(tx);r.developLoL();}
}/* output
卖英雄
卖皮肤
设计新英雄
平衡性调整
卖英雄
卖皮肤
*/

可以看到,使用静态代理时,我们需要为每个服务都创建代理类,工作量较大,而且不能动态修改。
另外,有同学可能要问了,这和装饰器模式有什么区别?确实,上面一段代码同样适用于装饰器模式,但装饰器模式的目的和代理模式是不一样的,装饰器模式更加偏重于拓展的功能。

动态代理

动态代理通过编写动态处理器实现,真正的代理对象由JDK运行时创建:
动态处理器:

public class DynamicProxyHandler implements InvocationHandler {private Object object;public DynamicProxyHandler(Object object){this.object = object;}@Overridepublic Object invoke(Object proxy, Method method,Object[] args) throws Throwable{System.out.println("设计游戏");System.out.println("设计皮肤");Object result = method.invoke(object, args);return result;}
}

可以看到,动态处理器实现了InvocationHandler接口的invoke方法,而该方法实际调用的是method对象的invoke方法,该方法用来执行某个的对象的目标方法。
接下来我们来编写测试类:

public class test {public static void main(String[] args) {LoL tx = new tencent();LoL tx_proxy = (LoL) Proxy.newProxyInstance(LoL.class.getClassLoader(), new Class[]{LoL.class}, new DynamicProxyHandler(tx));tx_proxy.developLoL();}
}/*output
设计游戏
设计皮肤
卖英雄
卖皮肤
*/

可以发现,相比于静态代理,动态代理是仅支持接口代理的,具体的代理对象生成由Proxy.newProxyInstance方法实现,该方法接收3个参数:
1.ClassLoader loader: 指定当前对象使用的类加载器
2.Class<?>[] interfaces :指定目标对象实现的接口的类型
3.InvocationHandler: 指定动态处理器

Java 进阶(三)动态代理相关推荐

  1. Java进阶 | Proxy动态代理机制详解

    一.Jvm加载对象 在说Java动态代理之前,还是要说一下Jvm加载对象的过程,这个依旧是理解动态代理的基础性原理: Java类即源代码程序.java类型文件,经过编译器编译之后就被转换成字节代码.c ...

  2. JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...

  3. 重学JAVA基础(三):动态代理

    1.接口 public interface Hello {public void sayHello(); } 2.实例类 public class Hello2 {public void sayHel ...

  4. Java的三种代理模式简述

    本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...

  5. 吃透Java中的动态代理

    动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...

  6. Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,动态创建一组指定的接口的实现类对象(代理对象)! 代理是实现AOP(面向切面编程)的核 ...

  7. Java的三种代理模式完整源码分析

    Java的三种代理模式&完整源码分析 Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCach ...

  8. Java se之动态代理

    转载自 Java se之动态代理 jdk动态代理: jdk动态代理是 需要提供一个实现了InvocationHandler接口的处理类: 通过Proxy的newProxyInstance()方法,参数 ...

  9. 学习spring必须java基础知识-动态代理

    2019独角兽企业重金招聘Python工程师标准>>> Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Jav ...

  10. java 笔记(3) —— 动态代理,静态代理,cglib代理

    0.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口. 代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存 ...

最新文章

  1. redis的分布式解决方式--codis (转)
  2. Java集合干货——ArrayList源码分析
  3. 均值归一化_超越BN和GN!谷歌提出新的归一化层:FRN
  4. 物联网产品背后潜藏着危机
  5. mysql+yes数据类型,怎样修改mysql列的数据类型?
  6. 了解 Windows Azure 存储的可伸缩性、可用性、持久性和计费
  7. 区块链100讲:ERC20 中文版
  8. 用Nginx作反向代理简单多了
  9. 回溯法求解背包问题java_背包问题回溯法的递归实现(java)
  10. 锐起2540无盘教程
  11. Intellij idea的Dependencies和Libraries有什么区别 ??
  12. sftp 中文乱码 连接后_LINUX SFTP 中文 乱码
  13. 对抗神经网络(GAN)
  14. 【机器学习-周志华】学习笔记-第十章
  15. 联想Thinkpad E430 原装win8改版win7的BIOS设置
  16. plsql打开sql窗口快捷键_PL/SQL 快捷键设置
  17. 上海内推 | 微软亚洲研究院(上海)AI-ML组招聘AI实习生
  18. 网工必须要了解BGP外部网关路由选择协议
  19. 修改linux开机启动界面,修改树莓派的开机启动画面,
  20. 贝叶斯推断应用:垃圾邮件过滤

热门文章

  1. canal版本升级方案
  2. 并发与竞争(四)信号量
  3. 说他是人像拍照大师,可有意见?
  4. python标准内建函数_python 内建函数(四)
  5. fastreport使用教程(fastreport报表编辑器)
  6. 灵魂书籍 | 莉尔·朗兹 |《如何让你爱的人爱上你 | 莉尔·朗兹》
  7. PPT文本框设置实用技巧分享,你都会吗?
  8. BJFU_数据结构习题_284基于深度优先搜索的两顶点路径存在与否的判断
  9. 2022年七夕礼物推荐!好看便宜又实用的礼物推荐
  10. C语言小头风,爸爸用C语言早教,孩子逐渐崩溃,网友:这发型月薪最少40k