`
huangyiming2009
  • 浏览: 22568 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

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. }   
package ttitfly.proxy;    
   
public interface HelloWorld {    
    public void print();    
//  public void say();    
} 
  



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

java 代码
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. }      
package ttitfly.proxy;    
   
public class HelloWorldImpl implements HelloWorld{    
   
    public void print(){    
        System.out.println("HelloWorld");    
    }    
//  public void say(){    
//      System.out.println("Say Hello!");    
//  }    
}    




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. }      
package ttitfly.proxy;    
   
public class StaticProxy implements HelloWorld{    
   
    public HelloWorld helloWorld ;    
    public StaticProxy(HelloWorld helloWorld){    
        this.helloWorld = helloWorld;    
    }    
        
    public void print(){    
        System.out.println("Welcome");    
        //相当于回调    
        helloWorld.print();    
    }    
        
//  public void say(){    
//      //相当于回调    
//      helloWorld.say();    
//  }    
}    




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. }      
package ttitfly.proxy;    
   
public class TestStaticProxy {    
   
    public static void main(String[] args){    
        HelloWorld helloWorld = new HelloWorldImpl();    
        StaticProxy staticProxy = new StaticProxy(helloWorld);    
        staticProxy.print();    
            
//      staticProxy.say();    
    }    
}    


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

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. }          
package ttitfly.proxy;        
       
import java.lang.reflect.InvocationHandler;        
import java.lang.reflect.Method;        
import java.lang.reflect.Proxy;        
//动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类        
public class DynamicProxy implements InvocationHandler{        
            
    private Object object;         
    //绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。    
    //Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法    
    public Object bindRelation(Object object){         
        this.object = object;        
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);         
    }         
    //拦截关联的这个实现类的方法被调用时将被执行        
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {         
        System.out.println("Welcome");        
        Object result = method.invoke(object, args);         
        return result;        
    }        
       
}        


测试类:
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. }          
分享到:
评论

相关推荐

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

    Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码

    Java静态代理和动态代理

    java静态代理和动态代理的区别,及其例子

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

    - 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...

    静态代理与动态代理小Demo

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

    java 代理demo

    java中代理的使用,包括静态代理、JDK动态代理、CGLIB动态代理的例子,想了解AOP和动态代理的童鞋可以看下

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    动态代理的代码例子 里面敲好了注释 搭配文章观看更好

    java jdk实列宝典 光盘源代码

    15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容...

    疯狂JAVA讲义

    1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 学生提问:为什么不安装公共JRE系统呢? 9 1.4.2 设置...

    java范例开发大全源代码

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    Java 高级特性.doc

    1.静态导入:先举个离例子 。 import java.lang.Integer.parseInt; public class StaticImport { int x = parseInt("123"); System.out.println(x); } 这样的程序如果不在IDE 工具中输入,是很难看出这个程序代码...

    java范例开发大全

    第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java...

    Java范例开发大全 (源程序)

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7...

    Java范例开发大全(全书源程序)

    Java范例开发大全(全书源程序),目录如下: 第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境...

    Java_JDBC由浅入深

    14.3.1 静态代理 78 14.3.2 动态代理 84 14.4 DBCP数据库连接池的使用 87 第十五节 jdbc轻量级封装 88 15.1 将结果集封装为Map 88 15.1.1 ResultSetMetaData演示 88 15.1.2解决多行记录的问题 89 15.1.3 Map结果集的...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例161 反射与动态代理 209 7.3 常见的未检查型异常 210 实例162 算数异常 210 实例163 数组存值异常 211 实例164 数组下标越界异常 212 实例165 空指针异常 213 7.4 常见的已检查型异常 214 实例166 类未发现异常 ...

    java6string源码-dataportal:代理远程数据服务;使静态JSON文件可在网络上搜索

    java6string源码数据门户 概述 Dataportal 是一个 Grails 网络应用程序,它通常代理实时或静态数据集。 它通过 URL 端点和规范化的 JSON 接口公开您的数据集。 静态数据集 - Dataportal 将 JSON 静态文件加载到 ...

Global site tag (gtag.js) - Google Analytics