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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© -_-# 中级黑马   /  2014-7-22 12:28  /  1684 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 -_-# 于 2014-7-23 12:00 编辑

(⊙o⊙)…。。。
今天面试完,。。。面试38.,
水平太次。。。。。。。。。。。说话说不清楚大舌头的人就是硬伤。
前段时间研究了代理。,并且也实现了一些很可爱的想法。看到群里各种人叫唤代理难,,好难。。。。
。。。。。。。。。。。。。。。。
其实
。。。。。。。。。。。。。
很简单。
。。。。。。。。。。
看下面丑陋的图图,先看明白解释图谱,再玩代理。。这样可以直接拿代理来用,懂原理,方法算个鸟~!哈哈
。。。。。。。。。。

上图是正常情况下的。。

现在。。。。这人直接光着身子去打劫,太傻了吧。。。

所以我想要打劫的时候,我先得蒙脸,打劫完,,哈哈数钱。。。。当然我抢钱的时候也要蒙脸,抢完也要数钱。。。。。

现在出现代理的情况。。。。如下图




第一步
准备一个实现类,一个代理类。代理类有方法蒙面,数钱
第二步
关进小黑屋商量。。。商量在用打劫方法时后先蒙面还是数钱,,其实在代码中就是代理类方法的摆放位置
第三步
小黑屋出来就直接是一个对象
这个对象可以当做实现类的对象,调用实现类方法。。。。
只是在调用实现类方法同时,会同时调用小黑屋中给定的代理类方法。。。

下面是枯燥的代码讲解环节

按照上面的步骤。。。
第一步,准备taget类,这个是实现类。。实现了一个接口
接口
public interface Seachbaba {
        public   void  dajie();
        public  void  qiangqian ();
        
}

实现类
public class SeachcopyFile implements Seachbaba {
        

        public  void moveFileAction(File res) throws Exception
        {
                        public void  dajie () {system.out.println("打劫")}

                               public  void qiangqian  (){          system.out.println("抢钱")    };                        
        
}

第二步,准备advice类代理类。实现一个接口
代理接口
public interface Advice  {
        public   void beforeMethod() ;
        
        public  void afterMethod()  ;
}

代理类
public class MyAdvicetime implements Advice {

                    long        k;
                 public void beforeMethod()
                        {
                                  k=System.currentTimeMillis();
                        
                        }
                        public void afterMethod(){
                                long y=System.currentTimeMillis();
                                System.out.println(y-k);                        
                        }
        
}

第三步。。。既然实现类和代理类有。就可以直接关进小黑屋生成对象了

    这里生成了一个实现类的代理对象  Object proxy3=Proxy.newProxyInstance
                        (
                                        target.getClass().getClassLoader(),//要看出这里面是构造函数啊~!,这是第一个参数,实现类类的加载器
                                        target.getClass().getInterfaces(),//第二个参数。实现类的爸爸类
                                        new InvocationHandler()//这是第三个参数。这个要实现一个子类接口,这才是真正的小黑屋
                                        {
                                                                        
                                                                        public Object invoke(Object proxy,Method method,Object args[])//这里三个参数,第一个代表当前代理对象。。第二个,当前实现类代理对象所调用的的方法、、、第三个调用方法给的参数。。、、这些都不用改。内部自动各自找各自的东西
                                                                        throws Exception
                                                                        {
                                                                                advice.beforeMethod();     //这个就是代理方法1
                                                                                
                                                                                Object retval=method.invoke(target,args);//这个是指调用实现类代理对象当前调用的方法,比如你在调用打劫,则他就是打劫。
                                                                                             

                                                                                advice.afterMethod();//这个是代理方法2数钱啊~!、、、、、这些代理方法可以随便放在任意位置~!比如把数钱放到打劫前面,则他会在打劫前看看自己有多少钱。
                                                                                
                                                                                return retval;//这里返回实现类代理对象调用打劫方法后的返回值,显然打劫方法没有返回值。
                                                                                
                                                                        }                        
                                        }
                        );

好了。。,,
第四步。。。可以直接用实现类代理对象。object proxy3调用实现类方法了。。。。必须转换对象类型。,比如。。taget类   k=(taget)proxy3;再用k来调用。。。。。

5 个回复

倒序浏览
发表到这里估计没人看,,发现闲聊的比较多
回复 使用道具 举报
接口
public interface Seachbaba {
         public   void  dajie();
         public  void  qiangqian ();
         
}

实现类
public class SeachcopyFile implements Seachbaba {
         

         public  void moveFileAction(File res) throws Exception
         {
                         public void moveFileAction() {system.out.println("打劫")}

                                public  void copyFile (){          system.out.println("抢钱")    };                        
         
}



你这个实现类怎么没有实现借口里的方法
回复 使用道具 举报
endian11 发表于 2014-7-23 00:04
接口
public interface Seachbaba {
         public   void  dajie();

不好意思。没改过来。。我现在改回来。。。。
回复 使用道具 举报
有点意思啊.
回复 使用道具 举报
没有回复可见,好评~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马