WEB开发网
开发学院软件开发Java Java 编程的动态性, 第四部分: 用 Javassist 进行... 阅读

Java 编程的动态性, 第四部分: 用 Javassist 进行类转换

 2010-03-18 00:00:00 来源:WEB开发网   
核心提示: 用 Javassist 来做来做使用 Javassist 操作类字节码以得到同样的效果看起来应该不难,Javassist 提供了在方法的开始和结束位置添加代码的方法,Java 编程的动态性, 第四部分: 用 Javassist 进行类转换(5),别忘了,我在为该方法中加入计时信息就是这么做的,然

用 Javassist 来做

来做使用 Javassist 操作类字节码以得到同样的效果看起来应该不难。Javassist 提供了在方法的开始和结束位置添加代码的方法,别忘了,我在为该方法中加入计时信息就是这么做的。

不过,还是有障碍。在描述 Javassist 是如何让您添加代码时,我提到添加的代码不能引用在方法中其他地方定义的局部变量。这种限制使我不能在 Javassist 中使用在源代码中使用的同样方法实现计时代码,在这种情况下,我在开始时添加的代码中定义了一个新的局部变量,并在结束处添加的代码中引用这个变量。

那么还有其他方法可以得到同样的效果吗?是的,我 可以在类中添加一个新的成员字段,并使用这个字段而不是局部变量。不过,这是一种糟糕的解决方案,在一般性的使用中有一些限制。例如,考虑在一个递归方法中会发生的事情。每次方法调用自身时,上次保存的开始时间值就会被覆盖并且丢失。

幸运的是有一种更简洁的解决方案。我可以保持原来方法的代码不变,只改变方法名,然后用原来的方法名增加一个新方法。这个 拦截器(interceptor)方法可以使用与原来方法同样的签名,包括返回同样的值。清单 3 展示了通过这种方法改编后源代码看上去的样子:

清单 3. 在源代码中添加一个拦截器方法

  private String buildString$impl(int length) { 
    String result = ""; 
    for (int i = 0; i < length; i++) { 
      result += (char)(i%26 + 'a'); 
    } 
    return result; 
  } 
  private String buildString(int length) { 
    long start = System.currentTimeMillis(); 
    String result = buildString$impl(length); 
    System.out.println("Call to buildString took " + 
      (System.currentTimeMillis()-start) + " ms."); 
    return result; 
  } 

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

Tags:Java 编程 动态性

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