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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tshch1989 中级黑马   /  2013-5-21 16:28  /  1751 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 tshch1989 于 2013-5-21 17:47 编辑

昨天看5月19的试题上有个动态代理的问题,今天研究了下,写了点小代码,但是对代理在实际应用还是理解不深刻,不知道能做点什么,有什么优点?

package reflect;
import java.lang.reflect.*;
public class ProxyDemo {
        /**
         * @param args
         * @throws SecurityException
         * @throws NoSuchMethodException
         * @throws InvocationTargetException
         * @throws IllegalArgumentException
         * @throws IllegalAccessException
         * @throws InstantiationException
         */
        public static void main(String[] args)  {
                // TODO Auto-generated method stub
                MyFoo mf=new MyFoo("zhangsan",22);
                MyInvocation handler=new MyInvocation(mf);
                Foo f=(Foo)Proxy.newProxyInstance(mf.getClass().getClassLoader(), mf.getClass().getInterfaces(), handler);
                System.out.println(f.getClass().getName());//测试参数是否是f
                Integer i=f.show();
                System.out.println(i);
        }
}
//要被代理的接口
interface Foo{
        public int show();
}
//实现了代理接口的类,再本例中实现的show()函数将被代理执行
class MyFoo implements Foo{
        private String name;
        private int age;
        MyFoo(String name,int age){
                this.name=name;
                this.age=age;
        }        
        @Override
        public int show() {
                // TODO Auto-generated method stub
                System.out.println("progress run..."+name+"..."+age);
                return 1;               
        }
}
//实现了InvocationHandler接口,该类的invoke方法将取代被代理类MyFoo中show()方法的直接运行;
class MyInvocation implements InvocationHandler{
        private Object obj=null;
        MyInvocation(Object obj){
                this.obj=obj;
        }
        @Override
        public Object invoke(Object arg0, Method arg1, Object[] arg2)
                        throws Throwable {
                // TODO Auto-generated method stub
                System.out.println(arg0.getClass().getName());//测试参数
                System.out.println(arg1.getName());//测试参数
                System.out.println("before progeress run");
                arg1.invoke(obj, arg2);
                System.out.println("after progress run");
                return 1;//测试返回,跟接口中的返回类型相同或兼容
        }        
}



评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 非常好

查看全部评分

10 个回复

倒序浏览
的访问。
代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 赞一个!

查看全部评分

回复 使用道具 举报
比如毕老师视频里面的,在代理里面计算运行时间,还有可以在目标类的原基础上进行增强。个人浅见,同问求更深的理解
回复 使用道具 举报
画饼 发表于 2013-5-21 16:47
的访问。
代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不 ...

不错  画饼   继续努力
回复 使用道具 举报
袁梦希 发表于 2013-5-21 17:00
不错  画饼   继续努力

谢谢袁总,我还在攒技术分呢
回复 使用道具 举报
画饼 发表于 2013-5-21 17:02
谢谢袁总,我还在攒技术分呢

别叫我袁总,都是兄弟,技术分好赚,你答得题也不错。加油吧:)
回复 使用道具 举报
画饼 中级黑马 2013-5-21 17:59:08
7#
袁梦希 发表于 2013-5-21 17:12
别叫我袁总,都是兄弟,技术分好赚,你答得题也不错。加油吧

哈哈,有幸的话,到黑马见你
回复 使用道具 举报
画饼 发表于 2013-5-21 17:59
哈哈,有幸的话,到黑马见你

你在论坛就能见到我的
回复 使用道具 举报
画饼 中级黑马 2013-5-21 18:03:25
9#
袁梦希 发表于 2013-5-21 18:01
你在论坛就能见到我的

莫非,您是女的,这么害羞?
回复 使用道具 举报
画饼 发表于 2013-5-21 18:03
莫非,您是女的,这么害羞?

纯爷们  ;P
回复 使用道具 举报
袁梦希 发表于 2013-5-21 18:07
纯爷们

哈哈。那就是了,是否你已经不在黑马了,哎,边上班边等答题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马