快速业务通道

Java动态代理机制分析及扩展,第1部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
roxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理 类;

通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接 口类型;

通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入 。

清单 3. 动态代理对象创建过程

// InvocationHandlerImpl 实现了 InvocationHandler 接口, 并能实现方法调用从代理类到委托类的分派转发 // 其内部通常包含指向委托类实例的引用,用于真正执行分派转发过来的方 法调用 InvocationHandler handler = new InvocationHandlerImpl (..); // 通过 Proxy 为包括 Interface 接口在内的一组接口动态创建代理类 的类对象 Class clazz = Proxy.getProxyClass(classLoader, new Class[] {  Interface.class, ... }); // 通过反射从生成的类对象获得构造函数对象 Constructor constructor = clazz.getConstructor(new Class[] {  InvocationHandler.class }); // 通过构造函数对象创建动态代理类实例 Interface Proxy = (Interface)constructor.newInstance(new Object [] { handler });

实际使用过程更加简单,因为 Proxy 的静态方法 newProxyInstance 已经为 我们封装了步骤 2 到步骤 4 的过程,所以简化后的过程如下

清单 4. 简化的动态代理对象创建过程

// InvocationHandlerImpl 实现了 InvocationHandler 接口, 并能实现方法调用从代理类到委托类的分派转发 InvocationHandler handler = new InvocationHandlerImpl (..); // 通过 Proxy 直接创建动态代理类实例 Interface proxy = (Interface)Proxy.newProxyInstance(  classLoader,   new Class[] { Interface.class },   handler );

Java动态代理机制分析及扩展,第1部分(3)

时间:2011-06-21 IBM / 王忠平 何平

接下来让我们来了解一下 Java 动态代理机制的一些特点。

首先是动态生成的代理类本身的一些特点。1)包:如果所代理的接口都是 public 的,那么它将被定义在顶层包(即包路径为空),如果所代理的接口中 有非 public 的接口(因为接口不能被定义为 protect 或 private,所以除 public 之外就是默认的 package 访问级别),那么它将被定义在该接口所在包 (假设代理了 com.ibm.developerworks 包中的某非 public 接口 A,那么新生 成的代理类所在的包就是 com.ibm.developerworks),这样设计的目的是为了 最大程度的保证动态代理类不会因为包管理的问题而无法被成功定义并访问;2 )类修饰符:该代理类具有 final 和 public 修饰符,意味着它可以被所有的 类访问,但是不能被再度继承;3)类名:格式是“$ProxyN”,其中 N 是一个 逐一递增的阿拉伯数字,代表 Proxy 类第 N 次生成的动态代理类,值得注意的 一点是,并不是每次调用 Proxy 的静态方法创建动态代理类都会使得 N 值增加 ,原因是如果对同一组接口(包括接口排列的顺序相同)试图重复创建动态代理 类,它会很聪明地返回先前已经创建好的代理类的类对象,而不会再尝试去创建 一个全新的代理类,这样可以节省不必要的代码重复生成,提高了代理类的创建 效率。4)类继承关系:该类的继承关系如图:

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

由图可见,Proxy 类是它的父类,这个规则适用于所有由 Proxy 创建的动态 代理类。而且该类还实现了其所代理的一组接口,这就是为什么它能够被安全地 类型转换到其所代理的某接口的根本原因。

接下来让我们了解一下代理类实例的一些特点。每个实例都会关联一个调用 处理器对象,可以通过 Proxy 提供的静态方法 getInvocationHandler 去获得 代理类实例的调用处理器对象。在代理类实例上调用其代理的接口中所声明

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号