首页 文章 精选 留言 我的

精选列表

搜索[问卷模式],共10000篇文章
优秀的个人博客,低调大师

Java中的动态代理模式

前言: 最近一直在分析hadoop的RPC机制。在hadoop中,DataNode和NameNode之间的控制信息的交流是通过RPC机制完成的,采用的是动态代理和java NIO的方式。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 { @Override public void show() { // TODO Auto-generated method stub System.out.println("我是A类!"); } } // 具体类B class ClassB implements AbstractClass { @Override public void show() { // TODO Auto-generated method stub System.out.println("我是B类!"); } } //动态代理类,实现InvocationHandler接口 class Invoker implements InvocationHandler { AbstractClass ac; public Invoker(AbstractClass ac) { this.ac = ac; } @Override public 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) { //创建具体类ClassB的处理对象 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类! 最新内容请见作者的GitHub页:http://qaseven.github.io/

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册