`

三言两语话动态代理

 
阅读更多
       在之前的一篇关于Decorator模式的Post中,曾经提到了动态代理(Dynamic Proxy)简化了Decorator模式的实现。作为例子的代码很容易理解,但这个简化的背后仍包含着很多值得去发掘的内容。
       首先我们来明确一下动态代理的定义:一个动态代理类在运行期implements一组interface,使得interface实现类的方法调用被分派至其他的类(另外的interface实现类或者任意的类)的方法。讲得更通俗一些,要了解动态代理,我们就要知道什么东西动态了,代理了什么?首先,一个Proxy代理了一组interface的方法。注意,代理的是interface,而不是Class,也不是abstract Class;其次,Proxy具有的型别由绑定的interface所决定的,动态就体现在此。也许看着这样的定义,还是会一头雾水,那么我们画幅图来看看吧。

dynamicProxy.gif

从图中,我们可以看到Dynamic Proxy并没有实现Resource这个接口,但是包含了Resource接口实现类的实例;在Dynamic Proxy的create方法中,通过调用Proxy.newProxyInstance创建一个Proxy,并将该Proxy与Resource接口绑定,最后将Proxy显式类型转换成Resource接口类型并返回,这样调用者就可以通过Proxy调用interface定义的方法了;由于Proxy与Resource接口绑定了,对Resource接口的方法调用,都会交由Proxy的invoke方法去处理。而invoke方法会根据不同的方法,或给以全新的实现,或直接将方法调用交给Proxy中包含的Resource接口实现类的实例去处理。综合上面所说的,作为一个Dynamic Proxy,它必须满足以下三个条件:
        1、实现了InvocationHandler接口,实现接口中定义的invoke方法;
        2、包含接口实现类的实例;
        3、通过Proxy.newProxyInstance方法实现Proxy与接口之间的绑定。
        以下代码给出了一个简单的Dynamic Proxy实现:

public interface Resource {
    
public void operationA();
    
public void operationB();
}
                                                
public class ConcreteResource implements Resource {
    
public void operationA() {
        System.
out.println("Operation A.");
    }

    
public void operationB() {
        System.
out.println("Operation B.");
    }

}
                                                
public class DynamicProxy implements InvocationHandler {
    
private Resource resource;

    
public DynamicProxy() {
        resource 
= new ConcreteResource();
    }


    
public Resource create() {
        Resource returnResource 
= null;
        returnResource 
= (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(), new Class[]{ Resource.class }this);
        
return returnResource;
    }


    
public Object invoke(Object obj, Method method, Object[] args) {
        Object o 
= null;
        
try {
            
if (method.getName().equals("operationA")) {
                System.
out.println("OperationA in Proxy");
            }
 else {
                o 
= method.invoke(obj, args);
            }

        }
 catch (Exception e) {
            e.printStackTrace();
        }

        
return o;
    }

}
                                             
public class Test {
    
public static void main(String[] args) {
        DynamicProxy proxy 
= new DynamicProxy();
        Resource resource 
= proxy.create();
        resource.operationA();
    }

}
                                                           
分享到:
评论

相关推荐

    三言两语.doc

    三言两语.doc

    三言两语话Erlang

    ### Erlang与并发编程 #### 引言 随着硬件技术的发展,多核处理器逐渐成为主流配置,这为软件设计带来了新的挑战与机遇。Erlang作为一种专为并发环境设计的编程语言,在这样的背景下显得尤为突出。...

    CAD布局三言两语教程

    CAD布局三言两语教程 关于CAD布局、打印、比例的详细解释

    三言两语小程序源码

    三言两语小程序源码 ,绝对对得起这个分数! 小程序瀑布了流, 小程序阅读器, 小程序案例,小程序成熟案例

    2020届高考语文 作文备考素材 一字一词勾勒年度热点,三言两语浓缩时代精神.doc

    2020届高考语文 作文备考素材 一字一词勾勒年度热点,三言两语浓缩时代精神.doc

    《三言两语说指针》指针对一个CC++程序员来讲重要性不言而喻

    此外,指针在动态内存管理中扮演关键角色。使用new运算符分配内存,返回的是内存块的起始地址,可以赋值给指针。当不再需要这块内存时,用delete释放。例如: ```cpp int *p = new int; // 动态分配一个int类型的...

    二年级写话教学存在的问题及对策PPT学习教案.pptx

    3) 三言两语型,阅读量不足和想象力贫乏导致学生的写话语句简短,缺乏生动性;4) 依赖家长型,学生过于依赖家长帮助,影响独立写作能力的培养。 针对这些问题,教案提出了相应的对策:1) 鼓励学生动笔,降低写话...

    “同居长干里,两小无嫌猜”的意思.doc

    1. 很少的几句话:三言两语 2. 随口乱说的话:胡言乱语 3. 说了很多的话:千言万语 4. 含有讽刺意味的风凉话:冷言冷语 5. 自己对自己说的话:自言自语 6. 无根据,恶意中伤的话:流言蜚语 7. 豪迈雄壮的话:...

    鼓励孩子的经典语句.docx

    "说话是没有硝烟的战争,三言两语说得好能赢得人心,三言两语说不好能招来杀身之祸",这句话教导孩子语言的力量,提醒他们在沟通中要注意表达方式。"你应该将注意的焦点集中在寻找方法上,而不是借口上",这强调了...

    新五四制人教统编版二年级上册语文 语文园地五 课件.pptx

    如"不言不语"表示沉默不说话,"只言片语"指少量的话语,"三言两语"形容话少而简洁,"千言万语"表示话语众多,"豪言壮语"形容豪迈激昂的话,"少言寡语"形容话少,"自言自语"是自己对自己说话,"甜言蜜语"则是讨好或...

    小学语文常识积累汇总.docx

    简短的话——三言两语,虚伪的话——甜言蜜语,动听的话——花言巧语,粗鲁的话——污言秽语,自言自语——自己对自己说话,恶言恶语——用恶毒的话骂人,轻言轻语——说话温和,豪言壮语——豪迈的话,千言万语——...

    jsp的环境搭建及测试演示

    由于jsp需要搭建环境,而环境的搭建,有时候又不是三言两语说得清楚的,尤其是数据库的链接(本文所用的是jsp + Sqlsever2000 环境),所以对初学者来说比较难上手。现在,我想结合自己的一些经验,演示并用最简单的...

    综合练习二.docx

    1. 很少的几句话:三言两语。 2. 说了很多的话:千言万语。 3. 自己对自己说的话:自言自语。 4. 豪迈雄壮的话:豪言壮语。 5. 像蜜糖似的话:甜言蜜语。 6. 随口乱说的话:胡言乱语。 7. 含有讽刺意味的风凉话:...

    Windows 汇编语言编程指南

    全部翻译完了,给我的感觉就是这篇文章是为已有汇编基础但从未接触过Windows汇编编程的读者写的,虽然对我来说这些内容很简单,但也觉得说的很详细了,好过国内许多三言两语的所谓菜鸟教程;但如果读者想全面学习Win...

    三年级语文下册课外积累阅读训练卷.doc

    - 三言两语(非常少的几句话);自言自语(自己对自己说话);甜言蜜语(虚假而动听的话);胡言乱语(随口胡说的话)。 3. 含有十二生肖动物的成语: - 例如:鼠目寸光、牛刀小试、虎背熊腰、兔死狐悲、龙飞凤舞...

    经典元宵节灯谜38则精选.doc

    例如,灯谜“五句话”对应的谜底是“三言两语”,意味着简短的话语;“反刍”对应“吞吞吐吐”,形容说话犹豫不决;“空袭警报”对应“一鸣惊人”,形容事物突然出现,引起轰动。这些成语的使用展示了汉语的精炼和...

    小学语文常识积累汇总.doc

    - 简短的话用“三言两语”:寥寥几句话就概括了意思。 - 虚伪而动听的话用“甜言蜜语”:用好听的话讨好别人。 - 为讨人喜欢而说的动听的话用“花言巧语”:虚假的恭维。 - 粗鲁的话用“污言秽语”:粗俗、下流...

    四年级语文素养试卷.doc

    - "很少的几句话":三言两语。 - "像蜜糖似的话":甜言蜜语。 - "自己对自己说的话":自言自语。 - "豪迈雄壮的话":豪言壮语。 - "虚假而动听的话":花言巧语。 - "随口乱说的话":胡言乱语。 6. 十二生肖歇...

    六年级语文素养竞赛试卷.doc

    - 含"言"和"语"的成语:例如"三言两语"表示很少的话,"自言自语"指自己对自己说话,"花言巧语"形容虚假动听的话,"胡言乱语"指随口乱说。 - AABB式成语:如"轰轰烈烈"形容规模气势大,"结结巴巴"形容说话不流利,...

Global site tag (gtag.js) - Google Analytics