`

代理模式_动态代理

阅读更多
设计模式之动态代理


  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();
        }
  }
}
        

分享到:
评论

相关推荐

    代理模式_动态代理.zip

    动态代理则是代理模式的一种特殊形式,它在运行时动态地创建代理对象,使得我们可以在不修改原有代码的情况下,增加或扩展对象的功能。 在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....

    代理模式_静态代理.zip

    设计模式之代理模式_静态代理的一个java实现的demo。主类在Client中。仅代码实现,可供初学者参考使用

    07代理模式_设计模式_

    在“07代理模式”这个资料中,可能包含了如何使用代理模式来实现上述各种代理类型的代码示例,包括静态代理的实现以及Java动态代理的API使用方法。通过学习这部分内容,你可以了解到如何在实际项目中应用代理模式,...

    设计模式之_动态代理_00_源码与文档

    代理模式是一种结构型设计模式,它为一个对象提供一个代理以控制对该对象的访问。代理对象在客户端和目标对象之间起到中介作用,可以用来添加额外的职责或者在调用目标对象前进行预处理,调用后进行后处理。 在Java...

    动态代理设计模式

    详细而又简单的讲述了java动态代理设计模式

    代理模式之动态代理

    在Java编程中,代理模式有静态代理和动态代理两种实现方式。本文将主要探讨动态代理,这是一种更灵活且适用于多种场景的技术。 动态代理通常在需要在调用目标方法前后执行额外操作时使用,例如日志记录、性能监控、...

    动态代理设计模式 日志和源码

    动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...

    设计模式_结构型_代理模式.md

    设计模式_结构型_代理模式

    设计模式_代理模式

    代理模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在面向对象的设计中。代理模式的主要目的是为其他对象提供一个替代品或占位符,以便控制对原对象的访问。这种模式允许我们创建一个代理类,该...

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

    Java代理模式Java动态代理

    自己总结的代理模式和Java中的动态代理模式,有源码

    Java设计模式——代理设计模式(静态代理和动态代理)

    在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在...在实际开发中,应根据项目需求选择合适的代理模式。

    设计模式之_代理模式

    在Java中,代理模式主要分为两种类型:静态代理和动态代理。 **静态代理**是在编译时就已经确定了代理关系。以下是一个简单的静态代理模式示例: 1. **接口SelfInterface**:定义了代理和真实对象共同实现的方法,...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    java模式设计-代理模式之动态代理.ppt

    java模式设计-代理模式之动态代理.ppt

    java装饰模式及动态代理模式示例源码

    装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...

    662.660.JAVA基础教程_动态代理与Java8新特性-代理模式与动态代理(662).rar

    在这个教程中,我们将深入探讨代理模式和动态代理技术,以及Java 8引入的一些重要改进。以下是关于这些主题的详细解释: 首先,代理模式是一种设计模式,它允许在不修改原有对象的情况下,为对象提供额外的功能或...

    代理模式的使用示例程序

    代理模式的实现通常有两种方式:静态代理和动态代理。静态代理是在编译时就确定了代理关系,需要为每个原始对象创建一个对应的代理类。动态代理则是在运行时动态创建代理对象,这通常通过Java的反射API或C#的`System...

    java静态代理、动态代理、装饰设计模式

    在Java编程中,代理模式是一种常见的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能统计等。...

Global site tag (gtag.js) - Google Analytics