hgx615 发表于 2013-2-5 01:07:46

代理模式_动态代理

设计模式之动态代理


http://hi.baidu.com/orris/blog/item/b8d4783e27a5c63d71cf6c0b.html


接口类:

public interface InterfaceObj {

         public abstract void request();
         public abstract String send();
}

目标类:

public class TargetObj implements InterfaceObj{

      public TargetObj(){}

      public void request()
      {
            System.out.println("this is a TargetObj's request");
      }
      public String send()
      {
            System.out.println("this is a TargetObj's send");
            return "a return obj";
      }
}

动态代理类:

必须实现InvocationHandler接口

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

public class DynamicProxy implements InvocationHandler{

      private Object obj = null;

      public DynamicProxy(){}

//构造方法赋值
      public DynamicProxy(Object obj)
      {
            this.obj = obj;
      }

//set方法赋值
      public void setObject(Object obj)
      {
            this.obj = obj;
      }

      public Object invoke(Object proxyObj,Method method,Object[] methodParam) throws Throwable
      {
            this.beforeRequest();
            try
            {

                  proxyObj = method.invoke(obj , methodParam);

            }catch(Exception ex)
            {
                  ex.printStackTrace();
            }
            this.afterRequest();
            return proxyObj;
            }

            public void beforeRequest()
            {
                  System.out.println("before Request!!!");
            }

            public void afterRequest()
            {
                  System.out.println("after Request!!!");
            }
}



测试类:


import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;

public class Test {

      public static void main(String[] args) {
      TargetObj targetObj = new TargetObj();//初始化被代理类
      InvocationHandler inhandler = new DynamicProxy(targetObj);//初始化代理类
      Class targetClass = targetObj.getClass();

//以下是一次性生成
/*
InterfaceObj io = (InterfaceObj)Proxy.newProxyInstance(targetClass.getClassLoader(), targetClass.getInterfaces(),inhandler );
io.request();
*/

//以下是分解步骤

      Class c = Proxy.getProxyClass(targetClass.getClassLoader(), targetClass.getInterfaces()) ;
      try {
                Constructor constr = c.getConstructor(new Class[]{InvocationHandler.class});
                InterfaceObj iobj = (InterfaceObj)constr.newInstance(new Object[]{inhandler});
                iobj.request();
                System.out.println("\n");
                String returnObj = (String)iobj.send();
                System.err.println("return:"+returnObj);
                System.err.println(Proxy.isProxyClass(c)+"-"+Proxy.isProxyClass(inhandler.getClass()));
      } catch (SecurityException e) {
                e.printStackTrace();
      } catch (NoSuchMethodException e) {
                e.printStackTrace();
      } catch (IllegalArgumentException e) {
                e.printStackTrace();
      } catch (InstantiationException e) {
                e.printStackTrace();
      } catch (IllegalAccessException e) {
                e.printStackTrace();
      } catch (InvocationTargetException e) {
                e.printStackTrace();
      }
}
}
页: [1]
查看完整版本: 代理模式_动态代理