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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 932759732 中级黑马   /  2013-4-1 17:41  /  1539 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨玄文 于 2013-4-3 12:14 编辑

下面这一段是在学习张孝祥老师的视频中MyEclipse自动生成的代码,只是一部分不是完整的代码。


private static Object getProxy(final Object target, final Advice advice) {
                Object proxy = Proxy.newProxyInstance(
                                target.getClass().getClassLoader(),
                                target.getClass().getInterfaces(),
                                new InvocationHandler(){
                                
        public Object invoke(Object proxy, Method method, Object[] args)
                                        throws Throwable {
        
                                advice.beforeMethod(method);
                                Object retValue = method.invoke(target, args);
                                advice.afterMethod(method);
                                return retValue;
                        }                        
                });
                return proxy;


不太懂为什么invoke方法的代码主体写在 Throwable中
这样写有什么好处呢。

第一次发帖,希望有大神能解答一下

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 新手鼓励一下!

查看全部评分

7 个回复

倒序浏览
Throwable表示可以抛出的,即错误和异常,没学异常的话不好理解,代码整理下可以看清楚:

     public Object invoke(Object proxy, Method method, Object[] args)  throws Throwable {
            advice.beforeMethod(method);
            Object retValue = method.invoke(target, args);
            advice.afterMethod(method);
            return retValue;
        }   

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
好处就是能让你通过编译,我没有调试,目测invoke方法主体里面肯定有一个check exception,Throwable是Exception的父类
回复 使用道具 举报
王亚东 发表于 2013-4-1 17:46
Throwable表示可以抛出的,即错误和异常,没学异常的话不好理解,代码整理下可以看清楚:

     public Obj ...

我知道Throwable是所有异常和错误的超类,并且是可抛出的
就是有点不太理解为什么要把代码的主体写在这里面
这些代码跟异常也不太沾边吧
回复 使用道具 举报
黄小贝 发表于 2013-4-1 17:49
好处就是能让你通过编译,我没有调试,目测invoke方法主体里面肯定有一个check exception,Throwable是Exce ...

意思就是省得我抛异常?
回复 使用道具 举报
不太明白你的问题,我猜一下吧:
invoke是InvocationHandler对象的一个方法,当代理对象执行方法时,其实是InvocationHandler把代理对象的方法交给invoke方法,
invoke方法中再来执行这个方法,这样前后就可以添加功能逻辑代码了,就像你的 advice.beforeMethod(method);
回复 使用道具 举报
王亚东 发表于 2013-4-1 17:59
不太明白你的问题,我猜一下吧:
invoke是InvocationHandler对象的一个方法,当代理对象执行方法时,其实是 ...

这段代码本身是可以通过编译,也可以运行的。
我就是单纯的想知道为什么要把代码的主体写在Throwable中,而不像一般的代码直接写在后面的{}中。

我自己猜测的是不是这样就可以省掉抛异常的步骤。
不懂就要问,所以就还是发帖问问。
看有没有人能解答。
回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马