看了下java核心技术中的代理,还是很晕

需要记住的东东:
   1.代理类是在程序运行过程中创建的,一旦创建就变成了常规类,与虚拟机种的任何其他类没有什么区别.
  2.所有的代理类都扩展于Proxy类,一个代理类只有一个实例变量--调用处理器,它定义在Proxy的超类中,为了履行代理对象的职责,所需要的任何附加数据都必须存储在调用处理器中.
   3.所有的代理类都覆盖了Object中的toString,equals和hashCode,如何所有的代理方法一样,这些方法仅仅调用了调用处理器的invoke.Object中的其他方法clone,getClass没有被重新定义.

感觉就是把原来的方法,拿到代理类里面执行,在执行前后可以加入自己的代码而已,spring的IOC就是这样的.
例子:

import java.lang.reflect.*;
import java.util.*;

public class PorxyTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Object[] elements = new Object[1000];
  
  for (int i = 0; i < elements.length; i ++) {
   Integer value = i + 1;
   Class[] interfaces = value.getClass().getInterfaces();
   InvocationHandler handler = new TraceHandler(value);
   Object proxy = Proxy.newProxyInstance(null, interfaces, handler);
   elements[i] = proxy;
  }
  Integer key = new Random().nextInt(elements.length) + 1;
  int result = Arrays.binarySearch(elements, key);
  
  if (result >= 0)
   System.out.println(elements[result]);
 }

}

class TraceHandler implements InvocationHandler {
 private Object target;
 public TraceHandler(Object t) {
  target = t;
 }
 
 public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
  System.out.print(target);
  System.out.print("." + m.getName() + "(");
  if (args != null) {
   for (int i = 0; i < args.length; i ++) {
    System.out.print(args[i]);
    if (i < args.length - 1) {
     System.out.print(",");
    }
   }
  }
  System.out.println(")");
  return m.invoke(target, args);
 }
}

posted on 2007-05-24 14:57 liujg 阅读(388) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

相册

收藏夹

boddiy

搜索

最新评论

阅读排行榜

评论排行榜