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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑昌奋 中级黑马   /  2013-3-22 17:59  /  1151 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑昌奋 于 2013-3-23 10:28 编辑

代理模式的原理谁能帮我分析一下,和一般在开发什么场景下会使用这个的呢

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

倒序浏览
哈哈,楼主,你好,我也是今天才弄明白的,我来说说自己的见解:

package com.danamic1;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public abstract class ProxyTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
               
                //被代理的对象的字节码
                HelloImp1 obj=new HelloImp1();
                Class clazz=obj.getClass();
               
               
                //LogHandler handler=new LogHandler(imp1);
               
                //Hello hello=(Hello)Proxy.newProxyInstance(clazz.getClassLoader(),
                //clazz.getInterfaces(), new LogHandler(obj));
                //传递三个参数:第一个是被代理对象的类加载器,被代理对象所实现的接口,以及一个实现了接口InvocationHandler的类
                //当Client需要调用被代理对象中的方法时,这些方法就是是实现了getInterfaces(),此时我们是对代理对象调用的这些方法
                //,代理对象相关联的InvocationHandler的实现类的invoke方法,即我们是实现了的
                //public Object invoke(Object proxy, Method method, Object[] args)
                //我们可以在invoke方法中是实现我们要的逻辑,包括调用被代理对象的方法,
                //method.invoke(targetObject,args),targetobject为被代理对象,被代理对象是
                //作为InvocationHandler实现类的成员变量,args是要传递的参数
                //还可以在调用被代理对象相关方法之前和之后添加某些操作,
                //当我们对代理对象执行某些操作时,这些操作和被代理对象操作一样,其实我们本意也是对代理对象的某些操作,
                //在本例中,我们是要使用被代理对象的print和sayhello方法,但是我们调用的却是代理对象,同时还可以执行dobefore
                //和doafter方法,对被代理对象进行包装
                Hello hello=(Hello)Proxy.newProxyInstance(clazz.getClassLoader(),
                                clazz.getInterfaces(), new LogHandler(obj));
               

                hello.print("洁");
                System.out.println("**************************************");
                hello.sayHello("宝贝你好");
        }
}


package com.danamic1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class LogHandler implements InvocationHandler {

        private Object target;
       
        public LogHandler(Object target) {
                super();
                this.target = target;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
               
                 doBefore();
                 
         System.out.println("method:"+method.getName());
         
        for(Object obj:args)
                System.out.println("args:"+(String)obj);
            
         
                 method.invoke(target, args);

                 doAfter();
                 
                return null;
        }
       
       
        private void doBefore(){
                System.out.println("before.......");
        }
       
        private void doAfter(){
                System.out.println("after........");
        }
}

楼主,还有一个接口和一个现实接口的类,这里就不讲了,要是不懂,可以再问我,我弄了两天才明白的。上面的注解和代码很详细了!
希望对你有帮助!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
王_强 发表于 2013-3-22 20:35
哈哈,楼主,你好,我也是今天才弄明白的,我来说说自己的见解:

package com.danamic1;

嗯,明白了、谢谢
回复 使用道具 举报
呵呵,没事的!大家都是相互学习!{:soso_e181:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马