简简单单的代码让你轻松学会 动态代理
原文出处: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();}
}
程序运行后的结果如下:
- 我是A类!
- 我是B类!
简简单单的代码让你轻松学会 动态代理相关推荐
- Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理
前言 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 很多人至今都是看到 代理就懵, 静态代理.动态代理.JDK动态代理.CGL ...
- 代理详解 静态代理+JDK/CGLIB 动态代理实战
1. 代理模式 代理模式是一种比较好理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对 ...
- cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战
1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...
- JAVA基础加强篇12——单元测试、反射、注解、动态代理
单元测试.反射.注解.动态代理 课程安排 单元测试 单元测试概述 单元测试 单元测试就是针对最小的功能单元编写测试代码,Java 程序最小的功能单元是方法,因此,单元测试就是针对 Java 方法的测试 ...
- java动态代理【一】
java动态代理的定义:为其他目标类的方法增加切面的逻辑,即在执行目标类方法的时候,先去执行一段如校验检测的逻辑代码.java通俗一点就是生成一个继承目标类的子类,并在每个调用方法都添加一段逻辑. 应 ...
- Java、Android静态代理与动态代理
代理 (1) 什么是代理? 大道理上讲代理是一种软件设计模式,目的地希望能做到代码重用.具体上讲,代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法.这个就好比 商户----&g ...
- Spring的静态代理和动态代理
2019独角兽企业重金招聘Python工程师标准>>> 代理模式主要有两种:静态代理和动态代理 1,静态代理: 比如要在输出"HelloWorld"前打印一个字符 ...
- 为什么要用动态代理?静态代理与动态代理详解
代理模式: 代理模式在Java中特别常见,如spring AOP功能就是用代理来实现的.代理模式作用是:在不修改被代理对象功能的基础上,通过对代理类进行扩展,进行一些功能上的附加与增强. 一般使用代理 ...
- 【动态代理】从源码实现角度剖析JDK动态代理
相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象.动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代 ...
最新文章
- linux 系统优化,调优
- java在cmd下编译运行
- android自定义控件实例
- XML DOM 节点
- 深度优先搜索——八皇后问题
- am5728 是否支持aarch64_AM5728高性能音视频处理开发板介绍
- python动态创建对象属性_Python学习笔记——动态添加属性与方法
- 针对中东石油能源工业控制系统的又一网军诞生
- 【原创】VBA学习笔记(316)VBA编程基础知识扫盲,只适合纯自学新手看
- React Native 实践之携程 Moles 框架
- 苹果企业证书_IOS_苹果企业签名_企业签名的圈外证书 拒绝频繁掉签!
- 浅谈塑胶件产品结构设计的几个主要原则
- R可视化07|ggplot2图层-标度图层(scale layer)-颜色盘篇
- 更好玩的跑步机,还有丰富课程资源,赤兔Air跑步机体验
- react-native 调用第三方 SDK
- 如何用python爬取新浪财经
- 关于 厦门“怪虫” 的一点感概
- IDEA服务器端JQuery框架加载失败--已解决
- 如何定位Unity死循环导致的完全卡死
- Windows Terminal安装指南
热门文章
- bash给脚本加进度条_shell脚本实现多彩进度条
- 计算机刚过国家线能调剂到哪些学校,2020考研:刚过国家线好不好调剂?这4个调剂策略!考生要知道...
- eclipse指定JDK版本启动,解决version XXX of the JVM is not suitable for this product.Version:XXX 问题
- 普通用户无法执行java,CentOS tomcat普通用户执行配置安装
- Java中List、Map、Set三个接口,存取元素时,各有什么特点?
- Windows 10环境下如何安装CMake?(更新时间:2021.9.13)
- 依赖配置中心实现注有@ConfigurationProperties的bean相关属性刷新
- AC_Dream 1211 Reactor Cooling
- android oneshot自动播放bug,移动端常见bug汇总001
- Linux检查依赖库,linux 查看依赖库