`
Dustin
  • 浏览: 314700 次
  • 性别: Icon_minigender_1
  • 来自: 广州/成都
社区版块
存档分类
最新评论

代理,动态代理,反射

阅读更多

Java中Proxy,Dynamic Proxy以及Reflection是什么关系呢?谈这个问题之前,我们要先了解三者究竟是什么东西。
    一、Proxy。面向对象中Proxy是比较常用的,作为GOF 23个模式之一,Proxy在Design Patterns一书中有着详细的描述。Proxy的使用范围很广,下面以一个简单的访问控制为例。在这种情况下,外部使用者要想使用某个对象,必须通过该对象的代理进行。在这里,Proxy充当着“网关”的角色,这样,在外部触及到内部对象之前,我们可以做很多有意义的工作,如身份认证等。下面是一个简单的例子:

java 代码
  1. public class ProxyTest { //劳工使用方   
  2.   public static void main(String[] args) {    
  3.       Job job = new Proxy(new Worker()); //劳工使用方找到代理,让它进行code的工作   
  4.       job.code();   
  5.   }   
  6. }   
  7. interface Job{   
  8.    public void code();   
  9. }   
  10. class Proxy implements Job{ //代理声称可以code   
  11.  private Worker wrk;   
  12.  public Proxy(Worker wrk){   
  13.   this.wrk = wrk;   
  14.  }   
  15.  public void code(){   
  16.    //代理把工作交给worker之前,可以进行使用者是否合法   
  17.   System.out.println("Check the permission");   
  18.   wrk.code();   
  19.  //worker做完以后,代理还可以做更多的工作   
  20.   System.out.println("Get the saraly");   
  21.  }   
  22. }   
  23. //Worker实际做code的工作,但是使用者不能直接找到他,   
  24. //而要通过代理   
  25. class Worker implements Job{   
  26.  public void code() {   
  27.     System.out.println("Worker code actually");   
  28.  }   
  29.     
  30. }   


   二、Dynamic Proxy。上面的Proxy,也可以叫做静态代理,它的特征是代理和实际作业的对象的类都是在编译期间就已经定下来的。与此相对的是动态代理,其代理是在程序运行期间动态产生的。Java对动态代理提供了相应的API,但只能接口方法的动态代理。动态代理一个典型应用就是实现数据库的连接池。由于使用JDBC的程序员习惯在使用完数据库的Connection对象后调用该对象的close方法关闭连接,这样连接池就失去作用了。这个问题我们可以使用动态代理技术来解决,当程序员调用Connection的close方法时,我们将其拦截下来,将其归还到连接池中,而不是直接关闭物理连接。下面是动态代理的一个实例。

java 代码
  1. public class DynamicProxy {   
  2.    public static void main(String[] args) throws Exception {   
  3.       Job job = JobFactory.getJob();   
  4.       job.code();   
  5.    }   
  6. }   
  7. interface Job{   
  8.   public void code();    
  9. }   
  10.   
  11. class Worker implements Job{   
  12.   public void code() {   
  13.     System.out.println("worker code");   
  14.   }   
  15.     
  16.   public void play(){   
  17.     System.out.println("worker play");   
  18.    }   
  19. }   
  20. class Handler implements InvocationHandler{   
  21.     private Worker worker;   
  22.     public Handler(Worker worker){   
  23.           this.worker = worker;   
  24.      }   
  25.    public Object invoke(Object obj, Method mtd, Object[] objs) throws Throwable {   
  26.      Object res = null;   
  27.      System.out.println("check permission");   
  28.      res = mtd.invoke(worker, objs);   
  29.      System.out.println("get the saraly");   
  30.      return res;   
  31.    }    
  32. }   
  33. class JobFactory {   
  34.  public static Job getJob() {   
  35.   Worker worker = new Worker(); //这是代理,可以代理接口指定的工作   
  36.   if (!(worker instanceof Job ))//判断是否有资格当这些工作的代理   
  37.    return null;   
  38.   /* construct a invocation handler with the impl instance */  
  39.   InvocationHandler handler = new Handler(worker); //这是实际工作的人   
  40.  /* get the class info, and the class loader used by this factory */  
  41.   Class[] interfaces = new Class[] { Job.class};   
  42.   ClassLoader loader = JobFactory.class.getClassLoader();   
  43.    Job proxy = (Job) Proxy.newProxyInstance(loader, interfaces, handler);   
  44.     return proxy;   
  45.  }   
  46. }   
  47.   
   动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。在JDBC连接池的例子中,如果我们使用普通的代理模式进行,那么我们要对Connection中的每一个方法进行单独处理,那么是比较繁琐的。如果,我们用动态代理的方式,实现起来就比较优雅。
    三、Reflection。Java中通过反射技术,我们可以在运行过程中得到相应类的各种方法和属性,并且可以进行修改和调用。动态代理技术就是基于反射实现的。当然,反射技术用处还很多,譬如JavaBean技术。
     现在是比较清楚了,Proxy和Dynamic Proxy都是一种模式,两者实现的功能相当,但是方式不同;Reflection是实现后者的技术基础。
分享到:
评论
1 楼 tony_javadream 2011-03-21  
不错,简单明了!终于概况明白了。

相关推荐

    JVM技术,反射与动态代理

    本主题将深入探讨JVM技术,特别是反射与动态代理这两个关键特性。 一、JVM技术 1. 类加载机制:JVM通过类加载器(ClassLoader)来加载.class文件,分为启动类加载器、扩展类加载器和应用程序类加载器。类的加载...

    AOP动态代理(反射机制)

    3. **反射机制**:在AOP动态代理中,反射机制扮演着重要角色。通过反射,我们可以动态获取类的信息,包括类的字段、方法等,并能够在运行时动态地调用方法。在创建代理对象和处理方法调用时,都会用到反射。 4. **...

    Java反射与动态代理

    Java反射是Java编程语言中的一个强大特性,...但需要注意的是,过度使用反射和动态代理可能会带来性能损失,因为它们都需要在运行时解析类信息,增加了额外的开销。因此,在实际开发中应适度使用,以平衡功能性和性能。

    java反射与动态代理笔记

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将深入探讨这两个概念及其在实际开发中的应用。 **Java反射** Java反射API允许程序在运行时检查类、接口...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的能力,这使得动态代理的实现成为可能。在Java中,可以使用java.lang.reflect包下的相关类和接口实现动态代理。 例如,通过...

    Java反射及动态代理

    详细讲解java的reflect包的,阐述反射机制及动态代理的细节问题。其中动态代理部分内容参考网上资料。读完此文,相信会对javaf反射机制有一个完整清楚的了解。尤其应该看看其他中代码举例部分。

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...

    java动态代理和反射

    java动态代理 public class HireProxy implements InvocationHandler { //被代理的真实角色 private Object obj; public HireProxy(Object obj) { super(); this.obj = obj; } //第二个参数method,被...

    java反射机制和动态代理的原理

    java反射机制和动态代理的原理,熟悉反射机制和动态代理

    Java动态代理和Java反射的Demo演示

    Java动态代理和反射是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将通过实例演示这两种技术,并详细解释它们的工作原理。 首先,我们来了解一下Java动态代理。动态代理主要...

    Java 反射-动态代理

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行上发挥着关键作用。本文将深入探讨这两个概念,以及如何在实际开发中利用它们。 首先,我们来理解Java反射(Reflection)。Java反射...

    Java反射机制与动态代理

    在Java中,动态代理是一种利用反射机制实现的编程技术,主要用于在运行时创建一个代理类,这个代理类可以代表并增强原始目标类的行为。Java的动态代理主要通过`java.lang.reflect.Proxy`和`java.lang.reflect....

    反射和动态代理(reflect and proxy)---含源码

    在Java编程语言中,反射(Reflection)和动态代理(Dynamic Proxy)是两个强大的特性,它们为程序员提供了在运行时检查和操作类、接口、对象的能力。这篇内容将深入讲解这两个概念,帮助初学者理解并掌握它们的应用...

    Jdk动态代理,cglib动态代理,反射和拦截器(链)示例

    Java中的动态代理、反射和拦截器是面向对象编程中非常重要的技术,它们在实现灵活性、扩展性和代码解耦方面发挥着关键作用。本资源提供的示例涵盖了这些核心概念,通过JDK动态代理、CGLIB动态代理以及拦截器链的实践...

    利用反射和动态代理机制实现自定义拦截器Interceptor

    利用反射和动态代理机制实现自定义拦截器Interceptor 在本文中,我们将探讨如何利用反射和动态代理机制来实现自定义拦截器Interceptor。拦截器Interceptor是一种常见的设计模式,用于在方法调用前后执行某些操作,...

    基于Java动态代理和反射机制实现ORM

    在Java中,基于动态代理和反射机制实现ORM可以提高代码的可维护性和灵活性。本篇文章将深入探讨如何在Java环境下,结合MySQL数据库,利用动态代理和反射技术来实现简单的ORM框架。 首先,我们需要了解动态代理和...

    JAVA 反射机制与动态代理ppt

    - **动态代理**:Java中的动态代理机制基于反射,可以创建一个代理类来拦截并处理方法调用,例如用于AOP(面向切面编程)。 - **插件系统**:在运行时加载未知的插件类,实现模块化和扩展性。 - **测试工具**:单元...

Global site tag (gtag.js) - Google Analytics