﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-singledu</title><link>http://www.blogjava.net/singledu/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 20 Jun 2026 16:42:58 GMT</lastBuildDate><pubDate>Sat, 20 Jun 2026 16:42:58 GMT</pubDate><ttl>60</ttl><item><title>性能测试的好文</title><link>http://www.blogjava.net/singledu/archive/2008/01/25/177682.html</link><dc:creator>嘟嘟</dc:creator><author>嘟嘟</author><pubDate>Fri, 25 Jan 2008 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/singledu/archive/2008/01/25/177682.html</guid><description><![CDATA[<h2 style="margin: 13pt 0cm;"><font face="Arial">1 </font><span style="font-family: 黑体;">概述</span></h2>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">在开发中，性能测试是设计初期容易忽略的问题，开发人员会为了解决一个问题而&#8220;不择手段&#8221;，作者所参与的项目中也遇到了类似问题，字符串拼接、大量的网络调用和数据库访问等等都对系统的性能产生了影响，可是大家不会关心这些问题，&#8220;</span>CPU<span style="font-family: 宋体;">速度在变快&#8221;，&#8220;内存在变大&#8221;，并且，&#8220;好像也没有那么慢吧&#8221;。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">有很多商业的性能测试软件可供使用，如</span>Jprofiler<span style="font-family: 宋体;">、</span>JProbe Profiler<span style="font-family: 宋体;">等，但在开发当中显得有些遥远而又昂贵。</span></p>
<h2 style="margin: 13pt 0cm;"><font face="Arial">2 </font><span style="font-family: 黑体;">目标</span></h2>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">本文将讲述如何利用</span>Java<span style="font-family: 宋体;">语言本身提供的方法在开发中进行性能测试，找到系统瓶颈，进而改进设计；并且在尽量不修改测试对象的情况下进行测试。</span></p>
<h2 style="margin: 13pt 0cm;"><font face="Arial">3 </font><span style="font-family: 黑体;">预备知识</span></h2>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">面向对象编程通过抽象继承采用模块化的思想来求解问题域，但是模块化不能很好的解决所有问题。有时，这些问题可能在多个模块中都出现，像日志功能，为了记录每个方法进入和离开时的信息，你不得不在每个方法里添加</span>log("in some method")<span style="font-family: 宋体;">等信息。如何解决这类问题呢？将这些解决问题的功能点散落在多个模块中会使冗余增大，并且当很多个功能点出现在一个模块中时，代码变的很难维护。因此，</span>AOP<span style="font-family: 宋体;">（</span>Aspect Oriented Programming<span style="font-family: 宋体;">）应运而生。如果说</span>OOP<span style="font-family: 宋体;">（</span>Aobject Oriented Programming<span style="font-family: 宋体;">）关注的是一个类的垂直结构，那么</span>AOP<span style="font-family: 宋体;">是从水平角度来看待问题。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">动态代理类可以在运行时实现若干接口，每一个动态代理类都有一个</span>Invocation handler<span style="font-family: 宋体;">对象与之对应，这个对象实现了</span>InvocationHandler<span style="font-family: 宋体;">接口，通过动态代理的接口对动态代理对象的方法调用会转而会调用</span>Invocation handler<span style="font-family: 宋体;">对象的</span>invoke<span style="font-family: 宋体;">方法，通过动态代理实例、方法对象和参数对象可以执行调用并返回结果。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">说到</span>AOP<span style="font-family: 宋体;">，大家首先会想到的是日志记录、权限检查和事务管理，是的，</span>AOP<span style="font-family: 宋体;">是解决这些问题的好办法。本文根据</span>AOP<span style="font-family: 宋体;">的思想，通过动态代理来解决一类新的问题——性能测试（</span>performance testing<span style="font-family: 宋体;">）。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">性能测试主要包括以下几个方面：</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">计算性能：可能是人们首先关心的，简单的说就是执行一段代码所用的时间</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">内存消耗：程序运行所占用的内存大小</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">启动时间：从你启动程序到程序正常运行的时间</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">可伸缩性</span>(scalability)</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">用户察觉性能</span>(perceived performance)<span style="font-family: 宋体;">：不是程序实际运行有多快</span>,<span style="font-family: 宋体;">而是用户感觉程序运行有多快</span>.</p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">本文主要给出了计算性能测试和内存消耗测试的可行办法。</span></p>
<h2 style="margin: 13pt 0cm;"><font face="Arial">4 </font><span style="font-family: 黑体;">计算性能测试</span></h2>
<h3 style="margin: 13pt 0cm;"><font size="5">4.1 <span style="font-family: 宋体;">目标：</span></font></h3>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">通过该测试可以得到一个方法执行需要的时间</span></p>
<h3 style="margin: 13pt 0cm;"><font size="5">4.2<span style="font-family: 宋体;">实现：</span></font></h3>
<p style="margin: 0cm 0cm 0pt;">Java<span style="font-family: 宋体;">为我们提供了</span>System. currentTimeMillis()<span style="font-family: 宋体;">方法，可以得到毫秒级的当前时间，我们在以前的程序当中一定也写过类似的代码来计算执行某一段代码所消耗的时间。</span></p>
<p>
<table style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" valign="top" width="568">
            <p style="margin: 0cm 0cm 0pt;"><!--<br />
            <br />
            Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
            http://www.CodeHighlighter.com/<br />
            <br />
            --><br />
            </p>
            <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
            <br />
            Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
            http://www.CodeHighlighter.com/<br />
            <br />
            --><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;start</span><span style="color: #000000;">=</span><span style="color: #000000;">System.currentTimeMillis();<br />
            <br />
            doSth();<br />
            <br />
            </span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;end</span><span style="color: #000000;">=</span><span style="color: #000000;">System.currentTimeMillis();<br />
            <br />
            System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">time&nbsp;lasts&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">(end</span><span style="color: #000000;">-</span><span style="color: #000000;">start)</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">ms</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
            <p style="margin: 0cm 0cm 0pt;"></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">但是，在每个方法里面都写上这么一段代码是一件很枯燥的事情，我们通过</span>Java<span style="font-family: 宋体;">的</span><span style="font-size: 10pt; font-family: Verdana;">java.lang.reflect.<strong>Proxy</strong></span><span style="font-family: 宋体;">和</span><span style="font-size: 10pt; font-family: Verdana;">java.lang.reflect.<strong>InvocationHandler</strong></span><span style="font-family: 宋体;">利用动态代理来很好的解决上面的问题。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">我们要测试的例子是</span><span style="font-size: 10pt; font-family: Verdana;">java.util.<strong>LinkedList</strong></span><span style="font-family: 宋体;">和</span><span style="font-size: 10pt; font-family: Verdana;">java.util.<strong>ArrayList</strong></span><span style="font-size: 10pt; font-family: 宋体;">的</span><span style="font-size: 10pt; font-family: Verdana;">get(int index)</span><span style="font-family: 宋体;">方法</span><span style="font-size: 10pt; font-family: 宋体;">，</span><span style="font-family: 宋体;">显然</span><span style="font-size: 10pt; font-family: Verdana;">ArrayList</span><span style="font-family: 宋体;">要比</span><span style="font-size: 10pt; font-family: Verdana;">LinkedList</span><span style="font-family: 宋体;">高效，因为前者是随机访问，而后者需要顺序访问。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">首先我们创建一个接口</span></p>
<p>
<table style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" valign="top" width="568">
            <p style="margin: 0cm 0cm 0pt;">public interface Foo {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; public void testArrayList();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; public void testLinkedList();</p>
            <p style="margin: 0cm 0cm 0pt;">}</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">然后我们创建测试对象实现这个接口</span></p>
<p>
<table style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" valign="top" width="568">
            <p style="margin: 0cm 0cm 0pt;">public class FooImpl implements Foo {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private List link=new LinkedList();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private List array=new ArrayList();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public FooImpl()</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;10000;i++)</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array.add(new Integer(i));</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; link.add(new Integer(i));</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; public void testArrayList()</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;10000;i++)</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array.get(i);</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; }</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; public void testLinkedList()</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;10000;i++)</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; link.get(i);</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; }</p>
            <p style="margin: 0cm 0cm 0pt;">}</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">接下来我们要做关键的一步，实现</span>InvocationHandler<span style="font-family: 宋体;">接口</span></p>
<p>
<table style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" valign="top" width="568">
            <p style="margin: 0cm 0cm 0pt;">import java.lang.reflect.InvocationHandler;</p>
            <p style="margin: 0cm 0cm 0pt;">import java.lang.reflect.Method;</p>
            <p style="margin: 0cm 0cm 0pt;">import java.lang.reflect.*;</p>
            <p style="margin: 0cm 0cm 0pt;">public class Handler implements InvocationHandler {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Object obj; </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; public Handler(Object obj) { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;this.obj = obj; </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; } </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; public static Object newInstance(Object obj) { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object result = Proxy.newProxyInstance(obj.getClass().getClassLoader(), </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj.getClass().getInterfaces(), new Handler(obj)); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (result); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; } </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object result; </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("begin method " + method.getName() + "("); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; args != null &amp;&amp; i &lt; args.length; i++) { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &gt; 0) System.out.print(","); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(" " + </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args[i].toString()); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(" )"); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long start=System.currentTimeMillis();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = method.invoke(obj, args); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long end=System.currentTimeMillis();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("the method "+method.getName()+" lasts "+(end-start)+"ms");</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InvocationTargetException e) { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;throw e.getTargetException(); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RuntimeException </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("unexpected invocation exception: " + </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.getMessage()); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("end method " + method.getName()); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result; </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; } </p>
            <p style="margin: 0cm 0cm 0pt;">}</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">最后，我们创建测试客户端，</span></p>
<p>
<table style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" valign="top" width="568">
            <p style="margin: 0cm 0cm 0pt;">public class TestProxy {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; public static void main(String[] args) { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foo foo = (Foo) Handler.newInstance(new FooImpl()); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foo.testArrayList();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foo.testLinkedList();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
            <p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;">}</p>
            <p style="margin: 0cm 0cm 0pt;">}</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">运行的结果如下：</span></p>
<p>
<table style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" valign="top" width="568">
            <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">begin method testArrayList( )</span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">the method testArrayList lasts 0ms</span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">end method testArrayList</span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">begin method testLinkedList( )</span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">the method testLinkedList lasts 219ms</span></p>
            <p style="margin: 0cm 0cm 0pt;"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">end method testLinkedList</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">使用动态代理的好处是你不必修改原有代码</span>FooImpl<span style="font-family: 宋体;">，但是一个缺点是你不得不写一个接口，如果你的类原来没有实现接口的话。</span></p>
<h3 style="margin: 13pt 0cm;"><font size="5">4.3<span style="font-family: 宋体;">扩展</span></font></h3>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">在上面的例子中演示了利用动态代理比较两个方法的执行时间，有时候通过一次简单的测试进行比较是片面的，因此可以进行多次执行测试对象，从而计算出最差、最好和平均性能。这样，我们才能&#8220;加快经常执行的程序的速度，尽量少调用速度慢的程序&#8221;。</span></p>
<h2 style="margin: 13pt 0cm;"><font face="Arial">5 </font><span style="font-family: 黑体;">内存消耗测试</span></h2>
<h3 style="margin: 13pt 0cm;"><font size="5">5.1 <span style="font-family: 宋体;">目标</span></font></h3>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">当一个</span>java<span style="font-family: 宋体;">应用程序运行时，有很多需要消耗内存的因素存在，像对象、加载类、线程等。在这里只考虑程序中的对象所消耗的虚拟机堆空间，这样我们就可以利用</span>Runtime <span style="font-family: 宋体;">类的</span>freeMemory()<span style="font-family: 宋体;">和</span>totalMemory()<span style="font-family: 宋体;">方法。</span></p>
<h3 style="margin: 13pt 0cm;"><font size="5">5.2 <span style="font-family: 宋体;">实现</span></font></h3>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">为了方便期间，我们首先添加一个类计算当前内存消耗。</span></p>
<p>
<table style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" valign="top" width="568">
            <p style="margin: 0cm 0cm 0pt;">class Memory</p>
            <p style="margin: 0cm 0cm 0pt;">{</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static long used()</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long total=Runtime.getRuntime().totalMemory();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long free=Runtime.getRuntime().freeMemory();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (total-free);</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p style="margin: 0cm 0cm 0pt;">}</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">然后修改</span>Handler<span style="font-family: 宋体;">类的</span>invoke()<span style="font-family: 宋体;">方法。</span></p>
<p>
<table style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" valign="top" width="568">
            <p style="margin: 0cm 0cm 0pt;">public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object result; </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("begin method " + method.getName() + "("); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; args != null &amp;&amp; i &lt; args.length; i++) { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &gt; 0) System.out.print(","); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(" " + </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args[i].toString()); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(" )"); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long start=Memory.used();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = method.invoke(obj, args); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long end=Memory.used();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("memory increased by "+(end-start)+"bytes");</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InvocationTargetException e) { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw e.getTargetException(); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RuntimeException </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("unexpected invocation exception: " + </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.getMessage()); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally { </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("end method " + method.getName()); </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result; </p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp; }</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">同时我们的测试用例也做了一下改动，测试同样一个显而易见的问题，比较一个长度为</span>1000<span style="font-family: 宋体;">的</span>ArrayList<span style="font-family: 宋体;">和</span>HashMap<span style="font-family: 宋体;">所占空间的大小，接口、实现如下：</span></p>
<p>
<table style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" valign="top" width="568">
            <p style="margin: 0cm 0cm 0pt;">public interface MemoConsumer {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void creatArray();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void creatHashMap();</p>
            <p style="margin: 0cm 0cm 0pt;">}</p>
            <p style="margin: 0cm 0cm 0pt;">public class MemoConsumerImpl implements MemoConsumer {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArrayList arr=null;</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HashMap hash=null;</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void creatArray() {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr=new ArrayList(1000);</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void creatHashMap() {</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hash=new HashMap(1000);</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p style="margin: 0cm 0cm 0pt;">}</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">测试客户端代码如下：</span></p>
<p>
<table style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" valign="top" width="568">
            <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemoConsumer arrayMemo=(MemoConsumer)Handler.newInstance(new MemoConsumerImpl ());</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arrayMemo.creatArray();</p>
            <p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arrayMemo.creatHashMap();</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">测试结果如下：</span></p>
<p>
<table style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 426.1pt; background-color: transparent;" valign="top" width="568">
            <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">begin method creatArray( )</span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">memory increased by 4400bytes</span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">end method creatArray</span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">begin method creatHashMap( )</span></p>
            <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">memory increased by 4480bytes</span></p>
            <p style="margin: 0cm 0cm 0pt;"><span style="background: white none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue; font-family: 'Courier New';">end method creatHashMap</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">结果一幕了然，可以看到，我们只需要修改</span>invoke()<span style="font-family: 宋体;">方法，然后简单执行客户端调用就可以了。</span></p>
<h2 style="margin: 13pt 0cm;"><font face="Arial">6 </font><span style="font-family: 黑体;">结束语</span></h2>
<p style="margin: 0cm 0cm 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AOP<span style="font-family: 宋体;">通过分解关注点和</span>OOP<span style="font-family: 宋体;">相得益彰，使程序更加简洁易懂，通过</span>Java<span style="font-family: 宋体;">语言本身提供的动态代理帮助我们很容易分解关注点，取得了较好的效果。不过测试对象必须实现接口在一定程度上限制了动态代理的使用，可以借鉴</span>Spring<span style="font-family: 宋体;">中使用的</span>CGlib<span style="font-family: 宋体;">来为没有实现任何接口的类创建动态代理。</span></p>
<h2 style="margin: 13pt 0cm;"><font face="Arial">7 </font><span style="font-family: 黑体;">参考资料</span></h2>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;">本文中提到的一些性能测试概念主要来自</span><a href="http://java.sun.com/docs/books/performance/">http://java.sun.com/docs/books/performance/</a></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体;">一些</span>AOP<span style="font-family: 宋体;">的概念来自</span>Jboss<span style="font-family: 宋体;">的</span><a href="http://www.jboss.org/index.html?module=html&amp;op=userdisplay&amp;id=developers/projects/jboss/aop">http://www.jboss.org/index.html?module=html&amp;op=userdisplay&amp;id=developers/projects/jboss/aop</a></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体;">动态代理和</span>AOP<span style="font-family: 宋体;">的某些知识来自</span><a href="http://www.springframework.org/docs/reference/aop.html">http://www.springframework.org/docs/reference/aop.html</a></p>
<h2 style="margin: 13pt 0cm;"><font face="Arial">8 </font><span style="font-family: 黑体;">作者声明</span></h2>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;">东西写的一般，不过是我辛勤劳动所为，转载请注明出处，可以通过</span><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#104;&#113;&#51;&#55;&#50;&#49;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">whq3721@163.com</a> <span style="font-family: 宋体;">与我联系,http://freshman.52blog.net</span></p>
<br />
<br />
本文来自：<a href="http://blog.csdn.net/freshmanya/archive/2004/11/28/196893.aspx">http://blog.csdn.net/freshmanya/archive/2004/11/28/196893.aspx</a><br />
<br />
<strong>笔记：</strong><br />
&nbsp;&nbsp;&nbsp; 文章写得很好，很实用。<br />
&nbsp;&nbsp;&nbsp; 采用java本身的动态代理机制实现的AOP来测试实现了某个接口的类的各个方法的性能，很妙。<br />
&nbsp;&nbsp;&nbsp; 正如作者所说的，这种方式的局限性就在于只能测试实现了某接口的类的测试。采用AspectJ应该会是更好的方式。
<img src ="http://www.blogjava.net/singledu/aggbug/177682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/singledu/" target="_blank">嘟嘟</a> 2008-01-25 10:25 <a href="http://www.blogjava.net/singledu/archive/2008/01/25/177682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>