原文出处:http://weixiaolu.iteye.com/blog/1477774

--------------------------------------------------------------------------

简简单单的代码让你轻松学会动态代理 
前言:

最近一直在分析hadoop的RPC机制。在hadoop中,DataNode和NameNode之间的控制信息的交流是通过RPC机制完成的,采用的是动态代理和java NIO(参考博客:http://weixiaolu.iteye.com/blog/1479656 ) 的方式。DataNode端是通过获得NameNode的代理,通过该代理和NameNode进行通信的,为了更好的分析hadoop的RPC机制我想先分析一下动态代理是怎么实现。下面就是动态代理的最最简单的代码实现,我们一起来看看吧。

代码如下:

package cn.xiaolu;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 动态代理类使用到了一个接口InvocationHandler和一个代理类Proxy ,这两个类配合使用实现了动态代理的功能。* 那么什么是动态代理呢?* 我们平常说的代理类是指: 给每个具体类写一个代理类,以后要使用某个具体类时,只要创建它的代理类的对象,然后调用代理类的方法就可以了。* 可是如果现在有许多的具体类,那就需要有许多的代理类才可以,这样很显然不合适。所以动态代理就应运而生了,我们只要写一个类实现* InvocationHandler 并实现它的invoke方法,然后再用Proxy的工厂方法newProxyInstance()创建一个代理对象,这个对象同样可以实现对具体类的代理功能。* 而且想代理哪个具体类,只要给Handler(以下代码中的Invoker)的构造器传入这个具体对象的实例就可以了。感觉是不是自己为该具体类造了一个代理类呢?呵呵~*///接口类
interface AbstractClass {public void show();}// 具体类A
class ClassA implements AbstractClass {@Overridepublic void show() {// TODO Auto-generated method stubSystem.out.println("我是A类!");}
}// 具体类B
class ClassB implements AbstractClass {@Overridepublic void show() {// TODO Auto-generated method stubSystem.out.println("我是B类!");}
}
//动态代理类,实现InvocationHandler接口
class Invoker implements InvocationHandler {AbstractClass ac;public Invoker(AbstractClass ac) {this.ac = ac;}@Overridepublic Object invoke(Object proxy, Method method, Object[] arg)throws Throwable {//调用之前可以做一些处理method.invoke(ac, arg);//调用之后也可以做一些处理return null;}
}/*** 测试类* @author 小路*/
class DynamicProxyTest {public static void main(String[] args) {//创建具体类ClassA的处理对象Invoker invoker1=new Invoker(new ClassA());//获得具体类ClassA的代理AbstractClass ac1 = (AbstractClass) Proxy.newProxyInstance(AbstractClass.class.getClassLoader(),new Class[] { AbstractClass.class }, invoker1);//调用ClassA的show方法。ac1.show();//创建具体类ClassB的处理对象Invoker invoker2=new Invoker(new ClassB());//获得具体类ClassB的代理AbstractClass ac2 = (AbstractClass) Proxy.newProxyInstance(AbstractClass.class.getClassLoader(),new Class[] { AbstractClass.class }, invoker2);//调用ClassB的show方法。ac2.show();}
}

程序运行后的结果如下:

Java代码  
  1. 我是A类!
  2. 我是B类!

简简单单的代码让你轻松学会 动态代理相关推荐

  1. Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理

    前言 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 很多人至今都是看到 代理就懵, 静态代理.动态代理.JDK动态代理.CGL ...

  2. 代理详解 静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对 ...

  3. cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  4. JAVA基础加强篇12——单元测试、反射、注解、动态代理

    单元测试.反射.注解.动态代理 课程安排 单元测试 单元测试概述 单元测试 单元测试就是针对最小的功能单元编写测试代码,Java 程序最小的功能单元是方法,因此,单元测试就是针对 Java 方法的测试 ...

  5. java动态代理【一】

    java动态代理的定义:为其他目标类的方法增加切面的逻辑,即在执行目标类方法的时候,先去执行一段如校验检测的逻辑代码.java通俗一点就是生成一个继承目标类的子类,并在每个调用方法都添加一段逻辑. 应 ...

  6. Java、Android静态代理与动态代理

    代理 (1) 什么是代理? 大道理上讲代理是一种软件设计模式,目的地希望能做到代码重用.具体上讲,代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法.这个就好比 商户----&g ...

  7. Spring的静态代理和动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式主要有两种:静态代理和动态代理 1,静态代理: 比如要在输出"HelloWorld"前打印一个字符 ...

  8. 为什么要用动态代理?静态代理与动态代理详解

    代理模式: 代理模式在Java中特别常见,如spring AOP功能就是用代理来实现的.代理模式作用是:在不修改被代理对象功能的基础上,通过对代理类进行扩展,进行一些功能上的附加与增强. 一般使用代理 ...

  9. 【动态代理】从源码实现角度剖析JDK动态代理

    相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象.动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代 ...

最新文章

  1. linux 系统优化,调优
  2. java在cmd下编译运行
  3. android自定义控件实例
  4. XML DOM 节点
  5. 深度优先搜索——八皇后问题
  6. am5728 是否支持aarch64_AM5728高性能音视频处理开发板介绍
  7. python动态创建对象属性_Python学习笔记——动态添加属性与方法
  8. 针对中东石油能源工业控制系统的又一网军诞生
  9. 【原创】VBA学习笔记(316)VBA编程基础知识扫盲,只适合纯自学新手看
  10. React Native 实践之携程 Moles 框架
  11. 苹果企业证书_IOS_苹果企业签名_企业签名的圈外证书 拒绝频繁掉签!
  12. 浅谈塑胶件产品结构设计的几个主要原则
  13. R可视化07|ggplot2图层-标度图层(scale layer)-颜色盘篇
  14. 更好玩的跑步机,还有丰富课程资源,赤兔Air跑步机体验
  15. react-native 调用第三方 SDK
  16. 如何用python爬取新浪财经
  17. 关于 厦门“怪虫” 的一点感概
  18. IDEA服务器端JQuery框架加载失败--已解决
  19. 如何定位Unity死循环导致的完全卡死
  20. Windows Terminal安装指南

热门文章

  1. bash给脚本加进度条_shell脚本实现多彩进度条
  2. 计算机刚过国家线能调剂到哪些学校,2020考研:刚过国家线好不好调剂?这4个调剂策略!考生要知道...
  3. eclipse指定JDK版本启动,解决version XXX of the JVM is not suitable for this product.Version:XXX 问题
  4. 普通用户无法执行java,CentOS tomcat普通用户执行配置安装
  5. Java中List、Map、Set三个接口,存取元素时,各有什么特点?
  6. Windows 10环境下如何安装CMake?(更新时间:2021.9.13)
  7. 依赖配置中心实现注有@ConfigurationProperties的bean相关属性刷新
  8. AC_Dream 1211 Reactor Cooling
  9. android oneshot自动播放bug,移动端常见bug汇总001
  10. Linux检查依赖库,linux 查看依赖库