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

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

 2010-02-24 00:00:00 来源:WEB开发网   
核心提示: do{//以接口名字列表作为关键字获得对应cache值Objectvalue=cache.get(key);if(valueinstanceofReference){proxyClass=(Class)((Reference)value).get();}if(proxyClass!=null){

do { 
  // 以接口名字列表作为关键字获得对应 cache 值 
  Object value = cache.get(key); 
  if (value instanceof Reference) { 
    proxyClass = (Class) ((Reference) value).get(); 
  } 
  if (proxyClass != null) { 
    // 如果已经创建,直接返回 
    return proxyClass; 
  } else if (value == pendingGenerationMarker) { 
    // 代理类正在被创建,保持等待 
    try { 
      cache.wait(); 
    } catch (InterruptedException e) { 
    } 
    // 等待被唤醒,继续循环并通过二次检查以确保创建完成,否则重新等待 
    continue; 
  } else { 
    // 标记代理类正在被创建 
    cache.put(key, pendingGenerationMarker); 
    // break 跳出循环已进入创建过程 
    break; 
} while (true); 

动态创建代理类的类对象。首先是确定代理类所在的包,其原则如前所述,如果都为 public 接口,则包名为空字符串表示顶层包;如果所有非 public 接口都在同一个包,则包名与这些接口的包名相同;如果有多个非 public 接口且不同包,则抛异常终止代理类的生成。确定了包后,就开始生成代理类的类名,同样如前所述按格式“$ProxyN”生成。类名也确定了,接下来就是见证奇迹的发生 —— 动态生成代理类:

清单 10. 动态生成代理类

// 动态地生成代理类的字节码数组 
byte[] proxyClassFile = ProxyGenerator.generateProxyClass( proxyName, interfaces); 
try { 
  // 动态地定义新生成的代理类 
  proxyClass = defineClass0(loader, proxyName, proxyClassFile, 0, 
    proxyClassFile.length); 
} catch (ClassFormatError e) { 
  throw new IllegalArgumentException(e.toString()); 
} 
 
// 把生成的代理类的类对象记录进 proxyClasses 表 
proxyClasses.put(proxyClass, null); 

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

Tags:Java 动态 代理

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