快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
); }&Exceptions &Return 

sync 方法还会在构造函数尾部被调用,从而将被代理类对象的变量信息同步 到代理类对象,实现类似于拷贝构造的等价效果。相应的,构造函数模板也需要 更新以支持该新特性。

清单 9. 更新后的构造函数模板

public &Name(java.lang.reflect.InvocationHandler  handler) {    super(&Parameters);    this.handler = handler;    // 被代理类到代理类方向的变量同步    sync(null, false); }

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

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

接下来介绍 sync 方法的实现,其思想就是首先获取被代理类的所有 Field 对象的列表,并通过扩展的调用处理器获得方法的声明类说对应的 stub 对象, 然后遍历 Field 对象列表并对各个变量进行拷贝同步。

清单 10. 声明在动态生成的代理类内部的 snyc 函数

private synchronized void sync(java.lang.Class clazz,  boolean toStub) {    // 判断是否为扩展调用处理器     if( handler instanceof InvocationHandlerEx )    {      java.lang.Class superClass = this.getClass ().getSuperclass();      java.lang.Class stubClass = ( clazz != null ? clazz  : superClass );      // 通过扩展调用处理器获得stub对象      Object stub = ((InvocationHandlerEx)handler).getStub (stubClass);      if( stub != null )      {        // 获得所有需同步的类成员列表,遍历并同步        java.lang.reflect.Field[] fields = getFields (superClass);        for(int i=0; fields! =null&&i<fields.length; i++)        {          try          {            fields[i].setAccessible(true);            // 执行代理类和被代理类的变量同步            if(toStub)            {              fields[i].set(stub, fields[i].get (this));            }            else            {              fields[i].set(this, fields[i].get (stub));            }          }          catch(Throwable e)          {          }        }      }    } }

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

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

这里涉及到一个用于获取类的所有 Field 对象列表的静态辅助方法 getFields。为了提高频繁查询时的性能,配合该静态方法的是一个静态的 fieldsMap 对象,用于记录已查询过的类其所包含的 Field 对象列表,使得再 次查询时能迅速返回其对应列表。相应的,类模板也需进行更新。

清单 11. 增加了静态 fieldsMap 变量后的类模板

package &Package; final public class &Name &Extends &Implements {    private static java.util.HashMap fieldsMap = new  java.util.HashMap();    private java.lang.reflect.InvocationHandler handler =  null;    &Constructors    &Methods }

清单 12. 声明在动态生成的代理类内部的静态方法 getFields

private static java.lang.reflect.Field[] getFields (java.lang.Class c) {    if( fieldsMap.containsKey(c) )    {      return (java.lang.reflect.Field[])fieldsMap.get(c);    }    java.lang.reflect.Field[] fields = null

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号