同时我们的测试用例也做了一下改动,测试同样一个显而易见的问题,比较一个长度为1000的ArrayList和HashMap所占空间的大小,接口、实现如下:

publicinterfaceMemoConsumer{

publicvoidcreatArray();

publicvoidcreatHashMap();

}

publicclassMemoConsumerImplimplementsMemoConsumer{

 

ArrayListarr=null;

HashMaphash=null;

 

publicvoidcreatArray(){

 

arr=newArrayList(1000);

}

publicvoidcreatHashMap(){

hash=newHashMap(1000);

}

}

  测试客户端代码如下:

MemoConsumerarrayMemo=(MemoConsumer)Handler.newInstance(newMemoConsumerImpl());

arrayMemo.creatArray();

arrayMemo.creatHashMap();

  测试结果如下:

beginmethodcreatArray()

memoryincreasedby4400bytes

endmethodcreatArray

beginmethodcreatHashMap()

memoryincreasedby4480bytes

endmethodcreatHashMap

  结果一幕了然,可以看到,我们只需要修改invoke()方法,然后简单执行客户端调用可以了。

  6结束语

  AOP通过分解关注点和OOP相得益彰,使程序更加简洁易懂,通过Java语言本身提供的动态代理帮助我们很容易分解关注点,取得了较好的效果。不过测试对象必须实现接口在一定程度上限制了动态代理的使用,可以借鉴Spring中使用的CGlib来为没有实现任何接口的类创建动态代理。