A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© hhmm665544 中级黑马   /  2014-4-10 22:29  /  910 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public static Object getProxy(final Object target,final Advice1 advice){
  2.                 Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
  3.                                 target.getClass().getInterfaces(),
  4.                                 new InvocationHandler() {
  5.                                        
  6.                                         @Override
  7.                                         public Object invoke(Object proxy, Method method, Object[] args)
  8.                                                         throws Throwable {
  9.                                                 /修改传入的参数
  10.                                                 if(args != null && args.length != 0){
  11.                                                         System.out.println(args.length);
  12.                                                         args[0] = args[0] + "我是代理加进去的参数";
  13.                                                 }
  14.                                                 advice.beforeMethod(method);
  15.                                                 Object retVal = method.invoke(target, args);
  16.                                                 advice.afterMethod(method);
  17.                                                 // TODO 自动生成的方法存根
  18.                                                 return retVal;
  19.                                         }
  20.                                 }
  21.                                 );
  22.                 return proxy;
  23.         }
复制代码
对于代理的参数一直都不太明白,target为什么一定要是接口

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 H._张_♂ 于 2014-4-11 14:00 编辑

       首先,说说为什么要代理。程序中的代理:要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如。异常处理、日志、计算方法的运行时间、事务管理等编写一个与目标类具有相同接口的代理类,代理类每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代理如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序。在配置文件中配置使用目标类还是代理类,这样比较好切换。
      面对代理编程,并不是必须是接口,比如有些类没有特殊的接口。我们难道就不能对他进行代理了吗?
      其实,我们要对一个类代理,必须找到一个实现了该类所有方法的类,面对接口编程的好处就是即能够找到这个类,还可以大大增加程序的可扩展性,比如现在用ArrayList,以后又要改成LinkedList,如果你面对List接口编程的话,你就不会用到ArrayList的特有方法,后直接把ArrayList改成LinkedList就行了,其他都不用改。
     再说你这道题,如果找不到一个接口,那你可以找个继承了你target类的子类来进行代理编程。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马