`

代理类的特征

 
阅读更多

代理类具用以下属性:

  • 代理类是公共的、最终的,而不是抽象的。
  • 未指定代理类的非限定名称。但是,以字符串 "$Proxy" 开头的类名空间应该为代理类保留。
  • 代理类扩展 java.lang.reflect.Proxy
  • 代理类会按同一顺序准确地实现其创建时指定的接口。
  • 如果代理类实现了非公共接口,那么它将在与该接口相同的包中定义。否则,代理类的包也是未指定的。注意,包密封将不阻止代理类在运行时在特定包中的成功定义,也不会阻止相同类加载器和带有特定签名的包所定义的类。
  • 由于代理类将实现所有在其创建时指定的接口,所以对其 Class 对象调用 getInterfaces 将返回一个包含相同接口列表的数组(按其创建时指定的顺序),对其 Class 对象调用 getMethods 将返回一个包括这些接口中所有方法的 Method 对象的数组,并且调用 getMethod 将会在代理接口中找到期望的一些方法。
  • 如果 Proxy.isProxyClass 方法传递代理类(由 Proxy.getProxyClass 返回的类,或由 Proxy.newProxyInstance 返回的对象的类),则该方法返回 true,否则返回 false。
  • 代理类的 java.security.ProtectionDomain 与由引导类加载器(如 java.lang.Object)加载的系统类相同,原因是代理类的代码由受信任的系统代码生成。此保护域通常被授予 java.security.AllPermission
  • 每个代理类都有一个可以带一个参数(接口 InvocationHandler 的实现)的公共构造方法,用于设置代理实例的调用处理程序。并非必须使用反射 API 才能访问公共构造方法,通过调用 Proxy.newInstance 方法(将调用 Proxy.getProxyClass 的操作和调用带有调用处理程序的构造方法结合在一起)也可以创建代理实例。

代理实例具有以下属性:

  • 提供代理实例 proxy 和一个由其代理类 Foo 实现的接口,以下表达式将返回 true:
         proxy instanceof Foo
     
    并且以下的强制转换操作将会成功(而不抛出 ClassCastException):
         (Foo) proxy
     
  • 每个代理实例都有一个关联的调用处理程序,它会被传递到其构造方法中。静态 Proxy.getInvocationHandler 方法将返回与作为其参数传递的代理实例相关的调用处理程序。
  • 代理实例上的接口方法调用将按照该方法的文档描述进行编码,并被指派到调用处理程序的 Invoke 方法。
  • 在代理实例上的 java.lang.Object 中声明的 hashCodeequalstoString 方法的调用将按照与编码和指派接口方法调用相同的方式进行编码,并被指派到调用处理程序的 invoke 方法,如上所述。传递到 invokeMethod 对象的声明类是 java.lang.Object。代理类不重写从 java.lang.Object 继承的代理实例的其他公共方法,所以这些方法的调用行为与其对 java.lang.Object 实例的操作一样。

在多代理接口中重复的方法

当代理类的两个或多个接口包含一个具有相同名称和参数签名的方法时,代理类的接口顺序变得非常重要。在代理实例上调用重复方法 时,传递到调用处理程序的 Method 对象没有必要成为其声明类可以从接口(通过该接口调用代理方法)的引用类型指派的对象。此限制存在的原因是,生成的代理类中的相应方法实现无法确定它通过哪一个接口调用。因此,在代理实例上调用重复方法时,第一个接口中的方法的 Method 对象包含接口的代理类列表中的方法(直接或通过超级接口继承),该对象会传递到调用处理程序的 invoke 方法,无论该方法调用通过哪一种引用类型发生。

如果代理接口包含某一方法,它的名称和参数签名与 java.lang.ObjecthashCodeequalstoString 方法相同,那么在代理实例上调用这样的方法时,传递到调用处理程序的 Method 对象将使 java.lang.Object 成为其声明类。换句话说,java.lang.Object 公共的非最终方法理论上在所有代理接口之前,以便确定哪一个 Method 对象传递到调用处理程序。

 

还要注意,当重复方法被指派到调用处理程序时,invoke 方法只可以抛出经过检查的异常类型,该异常类型可以使用所有 代理接口(可以通过它调用)中方法的 throws 子句指派一种异常类型。如果 invoke 方法抛出一个经过检查的异常,该异常没有指派给任何由一个代理接口(可以通过它调用)中的方法声明的异常类型,那么该代理实例上的调用将抛出一个未经检查的 UndeclaredThrowableException。此限制表示并非所有的由传递到 invoke 方法的 Method 对象上调用 getExceptionTypes 返回的异常类型都可以由 invoke 方法成功抛出。

分享到:
评论

相关推荐

    java静态代理与动态代理

     代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个...

    cgLib与JDK动态代理的用法

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

    java动态代理实现与原理详细分析.docx

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

    c#课件 c#资料 C# j经典部分 精华部分 类,接口,继承 文件操作 操作符重载 代理 属性 放射 特征 使用线程 异常处理 函数重载 集合 数组

    c#课件 c#资料 C# j经典部分 精华部分 类,接口,继承 文件操作 操作符重载 代理 属性 放射 特征 使用线程 异常处理 函数重载 集合 数组 欢迎下载!!

    Java 代理(proxy)模式

     代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个...

    论文研究-一类多期委托代理关系的模型研究.pdf

    论文研究-一类多期委托代理关系的模型研究.pdf, 企业的生产活动是由三大因素组成 :资产、劳动和技术 .本文从企业委托人拥有资产 ,代理人付出劳动 ,技术为中性出发 ,讨论...

    【Spring】3.助你跟面试官侃一个小时的AOP

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

    计算机应用基础作业(三)及答案.doc

    为客户提供接入因特网服务的代理商简称是 ISP 。 6. 利用任何一种通信线路使两台以上的计算机彼此连接并能传输双方共同可以识别的 数据信号的体系称为计算机数据 通信 系统。 7. 集调制/解调两种处理功能于一体的...

    Unchase.Odata.Connectedservice:一个Visual Studio扩展,用于通过生成客户端C#代理类连接到OData服务

    是Visual Studio扩展,用于为OData Web服务生成C#或VB客户端代码。 从Visual Studio Community 2019 v...根据OData规范1.0-4.0的OData规范生成C#和VB客户端/代理(客户端代码) 支持在OData协议版本4.0的开放类型上发

    人工智能和大数据时代的代理人歧视-研究论文

    从历史上看,这发生在一家公司有意通过依赖代理(例如邮政编码)来代理受保护类的成员的情况下,从而歧视受保护类的成员。 但是,当受保护阶级的成员身份可以预测歧视者的面部中立目标,从而使歧视“合理”时,代理...

    木马 病毒 预防 清除 删除

    6. 代理类木马 木马病毒的危害 如何防御木马病毒? 如何查出木马的一些方法 一、检测网络连接 二、禁用不明服务 三、轻松检查账户 如何删除木马病毒 ? 1、禁用系统还原(Windows Me/XP) 2、将计算机重启到安全...

    free-proxy:从 https 获取免费代理

    特征 获取 HTTP/HTTPS 代理 Promise 和 async/await 支持 ES6 类支持 以中高速获取代理 非中国代理 打字稿打字 要求 物品 细节 系统 GNU/Linux (>=2.6.x)、macOS (>=10.10.x)、Windows(晚于 XP) 环境 Node.js >= ...

    JAVA_SE_6_新特征.rar

    使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控...

    Java 基础核心总结 +经典算法大全.rar

    Collections 类集合实现类特征图 泛形 泛型的使用 用泛型表示类 用泛型表示接口泛型方法 泛型通配符 反射 Class 类Field 类Method 类ClassLoader 类 枚举 枚举特性 枚举和普通类-样枚举神秘之处 枚举类 I/O File...

    java基础核心总结归纳---参考手册--心得手册-学习资料-总结经验

    集合实现类特征图 23 泛形 23 反射 24 I/O 24 File 类 24 基础 IO 类和相关⽅法 25 InputStream 25 OutputStream 25 Reader 类 26 Writer 类 26 InputStream 及其⼦类 27 OutputStream 及其⼦类 27 Reader 及其⼦类 ...

    融合彩色不变量和SURB检测的特征点匹配算法

    为了解决传统匹配算法运行效率低、匹配精度低等问题,在快速特征点提取和描述(ORB)算法的基础上提出一种融合彩色不变量和基于加速稳健特征和对象请求代理(SURB)检测的优化匹配方法。首先,在同一复杂场景下,通过...

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

    ClassicJS:添加对ES6类的完全私有和受保护的支持,而不会阻止代理

    特征实例上的私有和受保护成员,即使使用代理包装也是如此。 经典构造函数上的私有静态成员和受保护的静态成员。 静态构造函数。 原型可修改的字段初始化。 抽象和最终课程。 支持HTML自定义元素。 可定位的super...

    JVM-Command:使用Java代理覆盖标准JRE类,以使我们能够对Java应用程序进行密集调试

    使用Java代理覆盖标准JRE类,以允许在任何Java应用程序上进行密集调试。 特征: 转储传递给JVM的每个Classfile。 阻止所有JVM出口。 阻止所有Runtime.exec调用。 阻止流程构建器。 阻止awt.Robot。 重写以防止...

    从零开始设计并构建“金科云盾”网站防护系统(全国云计算应用创新大赛一等奖作品),使用Nginx实现反向代理,负载均衡,统一日志

    自行构建web网站(敏感请求包括:注册、登录、详情、支付等),使用Nginx实现反向代理,负载均衡,并统一日志格式。模拟慢连接、DDOS、撞库、爆破等恶意攻击并统一数据格式,Logstash过滤收集有效日志,日志分类归档...

Global site tag (gtag.js) - Google Analytics