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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李挺 中级黑马   /  2013-2-23 10:13  /  2490 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public static Object getProxy(final Object target,final Advice myAdvice){
  2.                 Object proxy=Proxy.newProxyInstance(
  3.                                 target.getClass().getClassLoader(),
  4.                                 target.getClass().getInterfaces(),
  5.                                 new InvocationHandler() {
  6.                                         @Override
  7.                                         public Object invoke(Object proxy, Method method, Object[] args)
  8.                                                         throws Throwable {
  9.                                                 myAdvice.beginMethod();
  10.                                                 Object retVal=method.invoke(target, args);
  11.                                                 myAdvice.endMethod();
  12.                                                 return retVal;
  13.                                         }
  14.                                 });
  15.                 return proxy;
  16.         }
复制代码
上面是一个获得代理的函数,里面有个内部类叫做InvocationHandler
需要复写他的invoke()方法,注意到他需要传递一个Object proxy
可是这个Object proxy谁给的呢,他有没有用到这个参数啊

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
当你使用代理调用方法时,就会将使用的代理对象作为参数自动传入到invoke方法中了。
回复 使用道具 举报
我也很模糊,我认为,proxy是一个代理实例,谁调用这个方法,就传入谁的对象,这是我的理解。
回复 使用道具 举报
本帖最后由 铿锵科技 于 2013-2-23 10:54 编辑

  public Object invoke(Object proxy, Method method, Object[] args)
                                                        throws Throwable {
                                                myAdvice.beginMethod();
                                                //proxy=target;                                                
                                               //Object retVal = method.invoke(proxy, args);
                                                Object retVal=method.invoke(target, args);//这句等于上面注释了的2句了
                                                myAdvice.endMethod();
                                                return retVal;
                                        }
需要复写他的invoke()方法,注意到他需要传递一个Object proxy
可是这个Object proxy谁给的呢,他有没有用到这个参数啊,有上面红色的就是Object proxy参数的对象了

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
invoke(Object obj,Method method,Object[] args),
这里的第一个参数obj其实可以看作没有用处的,不知道jdk为什么要把它也当作一个参数放这里,methd.invoke()方法,需要把原来的具体实现类作为参数传递进去,method.invoke(obj,args)相当于obj.method(args)
回复 使用道具 举报
这是InvocationHandler的invoke方法的API文档:
Object invoke(Object proxy,
              Method method,
              Object[] args)
              throws Throwable
在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。
参数:
proxy - 在其上调用方法的代理实例
method - 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。

我理解的Object proxy就应该是Proxy.newProxyInstance()生成的代理实例proxy

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
李挺 中级黑马 2013-2-23 12:36:21
7#
铿锵科技 发表于 2013-2-23 10:30
public Object invoke(Object proxy, Method method, Object[] args)
                                  ...

target是finnal的,没必要自己定义个参数接受他吧?直接用就是了
回复 使用道具 举报
在invoke方法里边,加个打印语句,把proxy打印一下看看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马