`
ttitfly
  • 浏览: 622192 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

静态代理与动态代理

    博客分类:
  • java
阅读更多

1. 代理模式主要有两种:静态代理和动态代理

2. 静态代理:

比如要在输出“HelloWorld”前打印一个字符串“Welcome”

A:先定义一个接口类

java 代码
  1. package ttitfly.proxy;   
  2.   
  3. public interface HelloWorld {   
  4.     public void print();   
  5. //  public void say();   
  6. }   

 

B: 定义一个该接口的实现类

java 代码
  1. package ttitfly.proxy;   
  2.   
  3. public class HelloWorldImpl implements HelloWorld{   
  4.   
  5.     public void print(){   
  6.         System.out.println("HelloWorld");   
  7.     }   
  8. //  public void say(){   
  9. //      System.out.println("Say Hello!");   
  10. //  }   
  11. }   

 

C:定义一个静态代理类

java 代码
  1. package ttitfly.proxy;   
  2.   
  3. public class StaticProxy implements HelloWorld{   
  4.   
  5.     public HelloWorld helloWorld ;   
  6.     public StaticProxy(HelloWorld helloWorld){   
  7.         this.helloWorld = helloWorld;   
  8.     }   
  9.        
  10.     public void print(){   
  11.         System.out.println("Welcome");   
  12.         //相当于回调   
  13.         helloWorld.print();   
  14.     }   
  15.        
  16. //  public void say(){   
  17. //      //相当于回调   
  18. //      helloWorld.say();   
  19. //  }   
  20. }   

 

D: 一个测试类:

java 代码
  1. package ttitfly.proxy;   
  2.   
  3. public class TestStaticProxy {   
  4.   
  5.     public static void main(String[] args){   
  6.         HelloWorld helloWorld = new HelloWorldImpl();   
  7.         StaticProxy staticProxy = new StaticProxy(helloWorld);   
  8.         staticProxy.print();   
  9.            
  10. //      staticProxy.say();   
  11.     }   
  12. }   

 

可以看出静态代理类有一个很不爽的缺点:当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。这就增加了代码的复杂度。动态代理就可以避免这个缺点。

3 。动态代理

动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。

动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类

 代理类:

java 代码
  1. package ttitfly.proxy;       
  2.       
  3. import java.lang.reflect.InvocationHandler;       
  4. import java.lang.reflect.Method;       
  5. import java.lang.reflect.Proxy;       
  6. //动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类       
  7. public class DynamicProxy implements InvocationHandler{       
  8.            
  9.     private Object object;        
  10.     //绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。   
  11.     //Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法   
  12.     public Object bindRelation(Object object){        
  13.         this.object = object;       
  14.         return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);        
  15.     }        
  16.     //拦截关联的这个实现类的方法被调用时将被执行       
  17.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        
  18.         System.out.println("Welcome");       
  19.         Object result = method.invoke(object, args);        
  20.         return result;       
  21.     }       
  22.       
  23. }       

 

测试类:

java 代码
  1. package ttitfly.proxy;       
  2.       
  3. public class TestDynamicProxy {       
  4.     public static void main(String[] args){       
  5.         HelloWorld helloWorld = new HelloWorldImpl();       
  6.         DynamicProxy dp = new DynamicProxy();       
  7.         //在这里绑定的是HelloWorld,也就是HelloWorld是被代理接口。所以绑定关系时,需要传递一个HelloWorld的实现类的实例化对象。       
  8.         HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);        
  9.         helloWorld1.print();        
  10.         helloWorld1.say();       
  11.            
  12.         //helloWorld2将不被拦截   
  13.         HelloWorld helloWorld2 = new HelloWorldImpl();   
  14.         helloWorld2.print();        
  15.         helloWorld2.say();   
  16.            
  17.     }       
  18. }       

 

在测试类里调用实现类的print和say方法,因为代理类里代理了HelloWorld的所有方法。所以就不需要像静态代理类那样一一实现了。

分享到:
评论

相关推荐

    java静态代理与动态代理

    ### Java静态代理与动态代理详解 #### 一、代理模式概述 代理模式是软件工程领域中常用的一种设计模式,尤其在Java开发中极为常见。它主要用于控制对某个对象的访问,或者提供额外的功能如日志记录、性能追踪、...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    静态代理与动态代理的区别 代理模式可以进一步细分为静态代理和动态代理。 - **静态代理**:在程序编译时就已经确定代理类的具体实现方式。这意味着每次需要代理不同的操作时,都需要修改代理类的代码,这违反了...

    静态代理与动态代理Demo

    代理模式分为静态代理和动态代理两种主要形式,每种都有其特定的应用场景和优势。下面我们将深入探讨这两种代理模式,并通过一个“黄牛买票”的例子来具体说明。 首先,我们来看静态代理。静态代理是程序员在编译时...

    Java静态代理与动态代理demo

    Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...

    Java静态代理和动态代理

    四、静态代理与动态代理的比较 1. **灵活性**:动态代理比静态代理更灵活,因为不需要预先编写代理类的源代码,可以适应接口的变化。 2. **代码量**:静态代理需要为每个委托类编写单独的代理类,如果委托类很多,会...

    静态代理和动态代理Demo

    总结来说,这个资源提供了一个理解和实践静态代理与动态代理的好例子。通过学习和运行这些代码,你可以深入理解这两种代理模式的工作原理,以及如何在实际项目中应用它们。同时,这也有助于提升你对Java反射机制的...

    静态代理与动态代理小Demo

    一个静态代理和动态代理的小例子,开发时使用的工具是myeclipse,直接使用myeclipse工具导入即可,希望能 给大家理解这方面的入门知识带来些作用,同时也希望大家指出不足,我可以更加进行改进

    JAVA静态代理和动态代理

    静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的同时添加额外的功能。以下是一个简单的静态代理模式示例: 1. 定义接口: ...

    静态代理和动态代理

    根据实现方式的不同,代理模式可以分为静态代理和动态代理两种。 ### 静态代理 静态代理是在编译时就已经确定了代理关系。我们需要创建一个代理类,该类实现与目标对象相同的接口,并在代理类的方法中调用目标对象...

    包含静态代理和动态代理demo代码

    与静态代理相比,动态代理更灵活,它在运行时动态地创建代理类。Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理的步骤如下: 1. 定义一个接口...

    Spring的静态代理和动态代理

    本篇我们将深入探讨Spring中的静态代理和动态代理,这两种代理模式在实际开发中都有广泛的应用。 首先,让我们理解什么是代理。代理模式是一种设计模式,它为一个对象提供一个代理以控制对这个对象的访问。在Spring...

    静态代理和动态代理的讲解和案例,有详细的注释

    总结来说,静态代理在编译时就需要明确代理类与目标类的关系,而动态代理则在运行时动态创建代理类,更灵活但需要实现`InvocationHandler`接口。两者都可以用于在调用目标方法前后插入额外的逻辑,根据具体需求选择...

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

    代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...

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

    Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要程序员手动创建一个代理类,该类实现了与目标类相同的接口。代理类持有目标类的引用,并在调用目标类方法...

    静态代理和动态代理的例子

    代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...

    静态代理和动态代理简单实现代码

    静态代理是通过在源代码中创建一个代理类来实现的,这个代理类与真实对象(被代理的对象)有相同的接口。代理类在调用实际对象的方法时,可以添加额外的逻辑。以下是一个简单的静态代理示例: ```java // 接口 ...

Global site tag (gtag.js) - Google Analytics