快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
被涵盖的原因是它们是可以被其他类所访问的 。

第二步,遍历 Method 对象列表,对每个 Method 对象,进行相应的代码生 成工作。

清单 3. 对标签位进行代码替换生成方法代码

String declTemplate = "&Modifiers &ReturnType  &MethodName(&Parameters) &Throwables"; String bodyTemplate = "&Declaration &Body"; // 方法声明 String declare = declTemplate.replaceAll("&Modifiers",  getMethodModifiers( method ))    .replaceAll("&ReturnType", getMethodReturnType( method  ))    .replaceAll("&MethodName", method.getName())    .replaceAll("&Parameters", getMethodParameters( method  ))    .replaceAll("&Throwables", getMethodThrowables( method  )); // 方法声明以及实现 String body = bodyTemplate.replaceAll("&Declaration",  declare )    .replaceAll("&Body", getMethodEntity( method  ));

这里涉及了一些 ProxyEx 类的私有的辅助函数如 getMethodModifiers 和 getMethodReturnType 等等,它们都是通过反射获取所需的信息,然后动态地生 成各部分代码。函数 getMethodEntity 是比较重要的辅助函数,它又调用了其 他的辅助函数来生成代码并替换标签位。

清单 4. ProxyEx 的静态方法 getMethodEntity()

private static String getMethodEntity( Method method ) {    String template = "\n{"      + "\n  java.lang.reflect.Method method = null;"      + "\n  try{"      + "\n    method = &Class.getMethod(  \"&MethodName\", &ParameterTypes );"      + "\n  }"      + "\n  catch(Exception e){"      + "\n  }"      + "\n  Object r = null;"      + "\n  try{"      + "\n     r = handler.invoke( this, method,  &ParameterValues );"      + "\n  }&Exceptions"      + "\n  &Return"      + "\n}";    String result = template.replaceAll("&MethodName",  method.getName() )      .replaceAll("&Class", method.getDeclaringClass ().getName() + ".class")      .replaceAll("&ParameterTypes",  getMethodParameterTypesHelper(method))      .replaceAll("&ParameterValues",  getMethodParameterValuesHelper(method) )      .replaceAll("&Exceptions",  getMethodParameterThrowablesHelper(method))      .replaceAll("&Return", getMethodReturnHelper( method  ) );    return result; }

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

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

当为 Class 类型对象生成该类型对应的字符代码时,可能涉及数组类型,反 推过程会需要按递归方法生成代码,这部分工作由 getTypeHelper 方法提供

清单 5. ProxyEx 的静态方法 getTypeHelper()

private static String getTypeHelper(Class type) {    if( type.isArray() )    {      Class c = type.getComponent

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