`

代理类的特征

 
阅读更多

代理类具用以下属性:

  • 代理类是公共的、最终的,而不是抽象的。
  • 未指定代理类的非限定名称。但是,以字符串 "$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 方法成功抛出。

分享到:
评论

相关推荐

    cgLib与JDK动态代理的用法

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

    java静态代理与动态代理

    代理模式的核心特征在于,代理类与委托类(即被代理的类)拥有相同的接口,这意味着客户端可以通过代理类间接地调用委托类的方法。 #### 二、代理模式的关键概念 在代理模式中,主要涉及以下几个概念: 1. **委托...

    中国地产专业营销代理分类趋势.doc

    2. 地产营销代理公司特征: A. 专业营销代理品牌公司:如世联、博思堂等,拥有成熟的商业模式和专业团队,业务集中在一线城市,核心竞争力在于市场研究、项目规划和品牌推广,但由于运营成本高,通常选择大规模项目...

    Java 代理(proxy)模式

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

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

    4. **代理**:代理在C#中通常指的是委托(Delegate),它代表一个或多个方法,是事件处理的核心机制。通过委托,可以实现函数回调和匿名方法,是异步编程的基础。 5. **属性**:属性是C#中封装数据的一种方式,提供...

    基于多模态特征融合的Fast-Flux恶意域名检测方法.docx

    这类特征包括响应时间和响应包大小等,能够反映恶意域名解析过程中的一些行为特征。 #### 方法的主要贡献 1. **多模态特征的综合利用**:通过结合空间特征、文本特征和侧信息特征,本方法能够更全面地评估恶意域名...

    一种新的基于神经特征学习的呼叫中心代理不当行为检测半监督框架_A Novel Semi-supervised Framework

    本文提出的“一种新的基于神经特征学习的呼叫中心代理不当行为检测半监督框架”为解决这一问题提供了一个实用的解决方案。 在传统的呼叫中心操作中,识别代理的不当行为是一项挑战,因为这通常需要大量的人力和时间...

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

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

    公司的概念、特征与分类.pptx

    这种公司的优点在于便于筹资和提高管理水平,但容易产生权力集中和代理成本问题,设立过程复杂,且信息公开,稳定性相对较低。 5. 股份两合公司:少数无限责任股东和多数有限责任股东结合,具备股份有限公司的筹资...

    基于代理的自动工艺实现方案(PPT40).pptx

    工艺流程通常由输入器、生成器、审查器和批准器四个主要模块组成,这些模块通过代理类来实现。每个模块对应的代理类分别是输入器代理、生成器代理、审查器代理和批准器代理。 5. **代理(Agent)概念与特性**:代理...

    第九章 代理.ppt

    代理制度可以分为两大类:法定代理和委托代理。法定代理是指根据法律规定,如未成年人的父母对其子女的代理,或者精神障碍者监护人的代理。而委托代理则是基于被代理人和代理人之间的合同关系,被代理人明示或默示地...

    java基础部分的笔记,包含抽象,特征,映射,流,线程,反射等

    2. **特征**:在Java中,特征通常指的是类的属性(成员变量)和行为(方法)。类的特征定义了对象的状态和操作。访问修饰符如public, private, protected控制了这些特征的可见性,封装是面向对象的重要原则,通过...

    用于特征选择的乌鸦搜索算法的研究与改进.pdf

    乌鸦群体中的每个个体都可以作为一个搜索代理,通过搜索实现特征选择。乌鸦搜索算法的优点是简单、高效和易于实现,但其也存在一些缺陷,如易陷入局部最优解和收敛速度慢等。 logistic混沌映射是指一种混沌映射算法...

    永恒之塔3dmax模型魔族代理人

    对于"魔族代理人"来说,其设计可能融合了魔族的特征,如尖耳、翅膀或神秘的纹饰,同时体现出其代理人身份的威严和力量。 接下来是建模阶段,3DMax提供了多种建模工具,如可变形网格、多边形建模等,用于构建角色的...

    移动代理安全性的探讨

    本文将探讨移动代理的安全性问题,分析移动代理所面临的两大类安全威胁,并提出相应的保护措施。 #### 二、移动代理概述 **1. 定义** 移动代理是一种能够在网络中的多个主机间移动并执行特定任务的软件实体。与...

    上市公司控制权特征对现金持有的影响.pdf

    这篇论文聚焦于上市公司控制权特征如何影响其现金持有,通过实证分析2001年至2004年期间4821个非金融类A股上市公司的样本数据,揭示了控制权特征与现金持有之间的紧密联系。 首先,论文指出控制权特征主要包括股权...

    商业贸易类便利店行业经销代理领域分析报告(研究报告).pdf

    根据提供的文件信息,我们可以梳理出以下关于商业贸易类便利店行业经销代理领域的详细知识点: 1. 市场规模分析 - 通过分析过去五年中国市场行业研究报告的消费规模及同比增速,评估该行业的市场潜力与成长性。 -...

    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的开放类型上发

Global site tag (gtag.js) - Google Analytics