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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘印12 中级黑马   /  2013-4-5 02:24  /  1754 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘印12 于 2013-4-5 15:37 编辑

对于代理我一直很迷糊 求某个大侠教在下一条思路,并写上一个例子,本人将感激不尽

2 个回复

倒序浏览
本帖最后由 赵家阳 于 2013-4-5 08:15 编辑
  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. import java.util.ArrayList;
  5. import java.util.Collection;

  6. public class ProxyDemo {
  7.         public static void main(String[] args) {
  8.                 /*
  9.                  * static Object-->newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
  10.                  * 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
  11.                  * loader - 定义代理类的类加载器
  12.                  * interfaces - 代理类要实现的接口列表
  13.                  * h - 指派方法调用的调用处理程序
  14.                  */
  15.                 Collection proxy3 = (Collection)Proxy.newProxyInstance(
  16.                                 Collection.class.getClassLoader(),
  17.                                 new Class[]{Collection.class},
  18.                                 new InvocationHandler(){
  19.                                         @Override
  20.                                         public Object invoke(Object proxy, Method method, Object[] args)
  21.                                                         throws Throwable {
  22.                                                
  23.                                                 //指定一个目标
  24.                                                 ArrayList target = new ArrayList();
  25.                                                
  26.                                                 long beginTime = System.currentTimeMillis();
  27.                                                 Object retVal = method.invoke(target,args);
  28.                                                 Thread.sleep(10);
  29.                                                 long endTime = System.currentTimeMillis();
  30.                                                 System.out.println(method.getName()+"...running time:"+(endTime-beginTime));
  31.                                                
  32.                                                 return retVal;
  33.                                         }
  34.                                 }
  35.                                 );
  36.                
  37.                 proxy3.add("zxx");
  38.                 proxy3.add("lhm");
  39.                 proxy3.add("bxd");
  40.                
  41.                 System.out.println(proxy3.size());
  42.         }
  43. }
复制代码
用newProxyInstance()一步搞定。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
按照代理的创建时期,代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。  

/**
* 动态代理
*/
package com.ccsu.xie.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;

public class DynamicProxy {
        
        public static void main(String[] args) {
                Collection<String> coll = (Collection<String>)getProxy(new ArrayList(),new MyAdvice());
                coll.add("a");
                System.out.println(coll.size());
               
        }
        
        
        public static Object getProxy(final Object target,final Advice advice){
                                 //Proxy 提供用于创建动态代理类和实例的静态方法
                Object obj = Proxy.newProxyInstance(target.getClass().getClassLoader(),
                                target.getClass().getInterfaces(),
                                new InvocationHandler(){
                                        @Override
                                        public Object invoke(Object proxy, Method method,
                                                        Object[] args) throws Throwable {
                                                advice.beforeMethod(method);
                                                Object obj = method.invoke(target, args);
                                                advice.afterMethod(method);
                                                return obj;
                                        }
                        
                });
                return obj;
        }

}

//Advice.java
public interface Advice {
        public void beforeMethod(Method method);
        public void afterMethod(Method method);


}

//MyAdvice.java
package com.ccsu.xie.proxy;

import java.lang.reflect.Method;

public class MyAdvice  implements Advice{
        private long sTime,eTime;

        @Override
        public void afterMethod(Method method) {
                System.out.println("exit method...");
                eTime = System.currentTimeMillis();
                System.out.println("all of  time  : "+(eTime-sTime));
        }

        @Override
        public void beforeMethod(Method method) {
                System.out.println("come in method...");
                sTime = System.currentTimeMillis();
               
               
        }

        

}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马