本文希望将 Java 动态代理机制从接口扩展到类,使得类能够享有与接口类似的动态代理支持。

设计及特点

新扩展的类名为 ProxyEx,将直接继承于 java.lang.reflect.Proxy,也声明了与原 Proxy 类中同名的 public 静态方法,目的是保持与原代理机制在使用方法上的完全一致。

图 1. ProxyEx 类继承图

与原代理机制最大的区别在于,动态生成的代理类将不再从 Proxy 类继承,改而继承需被代理的类。由于 Java 的单继承原则,扩展代理机制所支持的类数目不得多于一个,但它可以声明实现若干接口。包管理的机制与原来相似,不支持一个以上的类和接口同时为非 public;如果仅有一个非 public 的类或接口,假设其包为 PackageA,则动态生成的代理类将位于包 PackageA;否则将位于被代理的类所在的包。生成的代理类也被赋予 final 和 public 访问属性,且其命名规则类似地为“父类名 +ProxyN”(N 也是递增的阿拉伯数字)。最后,在异常处理方面则与原来保持完全一致。

图 2. 动态生成的代理类的继承图

模板

通过对 Java 动态代理机制的推演,我们已经获得了一个通用的方法模板。可以预期的是,通过模板来定制和引导代理类的代码生成,是比较可行的方法。我们将主要使用两个模板:类模板和方法模板。

清单 1. 类模板

package &Package;

final public class &Name &Extends &Implements

{

private java.lang.reflect.InvocationHandler handler = null;

&Constructors

&Methods

}

类模板定制了代理类的代码框架。其中带“&”前缀的标签位被用来引导相应的代码替换。在此预留了包(&Package)、类名(&ClassName)、类继承(&Extends)、接口实现(&Implements)、构造函数集(&Constructors)及方法集(&Methods)的标签位。类模板还同时声明了一个私有型的调用处理器对象作为类成员。

清单 2. 方法模板

&Modifiers &ReturnType &MethodName(&Parameters) &Throwables

{

java.lang.reflect.Method method = null;

try {

method = &Class.getMethod( "& MethodName

final类是否可以被代理_Java 动态代理机制分析及扩展,第 2 部分相关推荐

  1. java动态代理_Java动态代理

    java动态代理 代理是一种设计模式. 当我们想添加或修改现有类的某些功能时,我们创建并使用代理对象. 使用代理对象而不是原始对象. 通常,代理对象具有与原始对象相同的方法,并且在Java代理类中,通 ...

  2. java动态代理_Java 动态代理 原理解析

    示例 需要代理的接口 public interface IHello {public void sayHello(); } 需要代理的类 public class HelloImpl implemen ...

  3. java动态代理_Java 动态代理和依赖注入

    [注]本文译自:https://psamsotha.github.io/jersey/2015/12/16/dynamic-proxies-dependency-injection.html 本文将讨 ...

  4. 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )

    文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...

  5. Java、Android静态代理与动态代理

    代理 (1) 什么是代理? 大道理上讲代理是一种软件设计模式,目的地希望能做到代码重用.具体上讲,代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法.这个就好比 商户----&g ...

  6. 【设计模式】代理模式 ( 动态代理 )

    文章目录 一.动态代理使用流程 二.动态代理代码示例 1.订单类 2.Service 接口 3.Service 实现类 4.Service 静态代理类 5.Dao 接口 6.Dao 实现类 7.Ser ...

  7. 代理模式——静态代理,动态代理(JDK代理和CGLib代理)

    概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...

  8. Java 动态代理机制分析及扩展--转

    http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/#icomments http://www.ibm.com/developerworks/c ...

  9. JAVA的静态代理与动态代理比较--转载

    扩展:http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/JAVA的静态代理与动态代理比较 一.概念 代理模式是常用的Java 设计模式,它的特 ...

最新文章

  1. 002_XMLHttpRequest对象
  2. Lesson 12.3 线性回归建模实验
  3. Python环境的安装
  4. js中cookie操作
  5. Django - 模板相关
  6. 奇安信代码安全实验室帮助Red Hat修复多个QEMU高危漏洞,获官方致谢
  7. 基于SSM框架的简单图书管理系统
  8. 如何删除绿盾加密软件
  9. 五大主流浏览器的介绍
  10. 安卓磁链搜索下载播放和原理探索
  11. 国内硕士申请加拿大计算机博士难度,【经验分享】如何申请加拿大硕士研究生或者博士?...
  12. 计算机网络自学之路,必看的网络工程师学习路线
  13. 沉浸式体验,文化与科技融合创新的新业态
  14. 什么是CDN,简单了解CDN
  15. 重复启动Tomcat时,大概率出现Deploying web application direct
  16. 福建福州软考考点安排在哪?
  17. 量子计算(一):量子计算是什么
  18. 【读书笔记】没有时间干活儿没有时间逛知乎,却有时间读书【刻意学习-Scalers-处事思维类】
  19. 区块链+游戏还有什么可能性?
  20. harbor配置nginx代理

热门文章

  1. gdb学习汇编(三)
  2. Win10设置mac
  3. win10 wsl和wsl2使用总结
  4. Linux内核dev_set_drvdata()和dev_get_drvdata()存储自定义结构体用法
  5. linux线程退出正确姿势demo
  6. Android 蓝牙音箱开发
  7. Spark算子--Scala版本 educoder
  8. hdfs java操作_hdfs java操作
  9. sim卡iccid编辑软件_一篇文章扫盲手机SIM卡相关知识
  10. SpringBoot 笔记