WEB开发网
开发学院软件开发Java Java 动态代理机制分析及扩展,第 2 部分 阅读

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

 2010-02-24 00:00:00 来源:WEB开发网   
核心提示: 清单 8. 更新后的方法模板(部分)Objectr=null;try{//代理类到被代理类方向的变量同步sync(&Class,true);r=handler.invoke(this,method,&ParameterValues);//被代理类到代理类方向的变量同步sync(&Class,fa

清单 8. 更新后的方法模板(部分)

Object r = null; 
try{ 
  // 代理类到被代理类方向的变量同步 
  sync(&Class, true); 
  r = handler.invoke( this, method, &ParameterValues ); 
  // 被代理类到代理类方向的变量同步 
  sync(&Class, false); 
}&Exceptions 
 
&Return 

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

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

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

接下来介绍 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) 
        { 
        } 
      } 
    } 
  } 
} 

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:Java 动态 代理

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接