`

Java动态代理模式

 
阅读更多

代理模式,就是因为某些原因,无法操作一个具体的对象concrete,那么就提供一个代理对象proxy,通过这个代理对象来操作具体的对象concrete。

代理模式有很多种,包括静态代理,保护代理,远程代理,动态代理等等,每一种都有特定的使用场景。本文主要介绍Java中的动态代理。

 

一、静态代理和动态代理的区别

       首先给出静态代理和动态代理的定义:

       静态代理:由程序员创建,或由工具自动生成源代码,然后进行编译。运行期间,代理的class文件已经存在。

       动态代理:程序运行时,通过反射机制动态创建而成。

 

       换句话说, 静态代理,是给每一个具体的类写一个代理类,需要用到具体类的时候,就给这个具体的类写一个代理类,然后调用代理类就行了,这些代码都是程序员手动编写,或者由一些工具生成的,在编译前必须完成。

       但是这样,会有一个很大的缺点,如果有很多具体类,就需要些很多个代理类,这样无疑产生了很多重复代码。所以如果需要用一个代理类,完成所有的接口,就需要使用动态代理来完成。

 

二、动态代理示例

      动态代理,使用了一个接口InvocationHandler,和一个代理类Proxy, 二者配合完成动态代理的功能。InvocationHandler, Proxy.,都在java.lang.reflet包里。

     

      InvocationHandler 只有一个方法: 

      

Object invoke(Object proxy, Method method, Object[] args); 

 

 

     Proxy主要有两个静态方法:

     

Class<?> getProxyClass(Classloader loader, Class<?> ... interfaces);   //返回一个动态创建的代理类 (Class)

Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h);  //返回代理类的实例

 

 

     所以, 通过Java中的反射,在运行时,动态的通过指定类加载器,接口数组,调用处理程序这3个参数,来动态生成代理类。这个就是动态代理的功能。

   

      示例代码如下:

     

//委托类接口
Inteface IDemo {
    void sayHello();
}

//具体委托类1,处理真正的业务逻辑
class Demo1 implements IDemo {
    @Override
    public void sayHello() {
        System.out.println("Demo1 say Hello");
    }   
}

//具体委托类2,处理真正的业务逻辑
class Demo2 implements IDemo {
    @Override 
     public void sayHello {
          System.out.println("Demo2 say Hello");
     }
}

//处理类
class DynamicInvocationHandler implements InvocationHandler {
      Object obj;

      @Override
      Object invoke (Object proxy, Method method, Object[] args) {
            return method.invoke(proxy,args);
       }
     
       Object bind(Object obj) {
            this.obj = obj;
            return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                                      obj.getClass().getInterfaces(),this);
       }
}

//客户端类,或者是测试类
class Client {
    public static void main(String[] args) {
         IDeomo demo = (IDemo) new DynamicInvocationHandler().bind(new Demo1());
         demo.sayHello();
    }
} 

 

       上面的代码中,有一个公用的委托类接口IDemo,两个具体的类Demo1, Demo2 实现了IDemo,用于处理具体的业务逻辑。

        

       然后,DynamicInvocationHandler实现了InvocationHandler接口,也实现了invoke()方法。但是,invoke()方法中,是标准的实现,并没有加入任何代码。真正有用的方法,是bind()方法。

      bind() 方法类似于一个工厂方法,返回了处理处理具体委托类的代理类。

      

       我们再来分析客户端的main()方法的流程。

       首先, new DynamicInvocationHandler(), 创建了一个DynamicInvocationHandler的对象。然后调用bind()方法,其中的参数是new Demo1(),也就是说,会创建一个处理Demo1的代理类的实例。如果我们想操作Demo2,那么参数中传new Demo2()就可以了。

 

       最后,查看newProxyInstance()方法,可以看到程序进行了验证,优化,缓存,生成字节码,显示加载等操作,最后调用了sun.misc.ProxyGenerator.generateProxyClass()来完成生成字节码的功能.也就是说,jvm是动态生成字节码,也就是class文件,来完成代理类的生成的。在jvm中,class文件不一定非要通过编译来实现,可以通过zip包获取(就是import xxx.jar之类的操作),可以通过网络获取,也可以动态生成。操作字节码的类库,有Cglib,ASM等等。

 

 

 

 

 

 

 

 

 

  • 大小: 35.8 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java 动态代理模式 适配器模式

    Java动态代理模式与适配器模式是两种在软件设计中常用的设计模式,它们都有各自的优点和应用场景。在Java中,动态代理模式主要依赖于Java的反射API和InvocationHandler接口,而适配器模式则用于解决不同接口之间的...

    JAVA动态代理模式.pdf

    Java动态代理模式是一种设计模式,它可以为其他对象提供一种代理以控制对这个对象的访问。在Java中,动态代理是利用反射机制实现的,可以在运行时动态生成代理类和对象。它主要应用于需要控制对象访问、提供额外功能...

    JAVA动态代理模式-.pdf

    JAVA动态代理模式-.pdf

    java动态代理 经典文章(word 2007格式的)

    - `Java动态代理模式.docx`可能详细讲解了动态代理模式的原理和实现,包括如何创建代理对象和实现`InvocationHandler`。 - `动态代理详解.docx`则可能深入讨论了Java动态代理的细节,包括实际应用场景和常见问题。...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

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

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

    对代理模式与Java动态代理类的理解

    对代理模式与Java动态代理类的理解说明

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

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

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

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

    java动态代理实例

    在这个实例中,我们将深入探讨Java动态代理的核心概念,以及如何利用它来实现拦截器模式。 首先,我们需要了解Java动态代理的基本原理。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....

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

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

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

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

    java + 动态代理 + 动态代理实际应用场景

    1:静态代理出现的实际背景,静态代理时如何演化成动态代理 2: 动态代理demo 举例实际应用场景(载入数据库驱动的时候,使用AIDL与系统Servic进行通信) 3: 动态代理使用到基础理论:ClassLoader 加载.class字节码...

    Java 静态代理模式

    Java静态代理模式是一种设计模式,它允许我们为一个对象提供一个代理,以便增强或扩展其功能,...然而,由于其存在的局限性,如需更灵活的代理机制,可以考虑使用Java的动态代理模式(如Java.lang.reflect.Proxy)。

    Java简单实现动态代理模式过程解析

    主要介绍了Java动态代理模式简单案例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    JAVA设计模式之代理模式实例

    在本实例中,我们将深入探讨Java中的代理模式及其应用。 代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用。它可以控制目标对象的访问,也可以在调用目标对象的...

    Java设计模式-代理模式例子

    在Java中,代理模式主要有静态代理和动态代理两种实现方式。 1. 静态代理:在编译时就已经确定了代理类与目标类的关系。通常,代理类会实现和目标类相同的接口,以便于在代理类中调用目标类的方法。这种方式的缺点...

    JAVA设计模式(代理模式)

    **Java设计模式——代理模式详解** 代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

Global site tag (gtag.js) - Google Analytics