登陆注册
8183300000082

第82章 7 动态代理类

小A:“动态代理类位于哪里?”

大B:“Java动态代理类位于Java。lang。reflect包下。”

小A:“它一般会涉及到哪些类呢?”

大B:“一般主要涉及到以下两个类:1、Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method,J2EEjava语言JDK1.4APIjavalangObject。html”>Object[]args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。这个抽象方法在代理类中动态实现。2、Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。Static Class getProxyClass(ClassLoader loader,Class[]interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。Static Object newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。

小A:“那什么是Dynamic Proxy?”

大B:“所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。在使用动态代理类时,我们必须实现InvocationHandler接口。”

抽象角色(之前是抽象类,此处应改为接口):

public interface Subject

{

abstract public void request();

}

具体角色RealSubject:同上;

代理角色:

import java。lang。reflect。Method;

import java。lang。reflect。InvocationHandler;

public class DynamicSubject implements InvocationHandler{

private Object sub;

public DynamicSubject(){

}

public DynamicSubject(Object obj){

sub=obj;

}

public Object invoke(Object proxy,Method method,Object[]args)throws Throwable{

System。out。println(“before calling” method);

method。invoke(sub,args);

System。out。println(“after calling” method);

return null;

}

}

大B:“该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;此外,在该类还实现了invoke方法,该方法中的method。invoke(sub,args);其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数。通过动态代理类,我们可以在调用之前或之后执行一些相关操作。”

客户端:

import java。lang。reflect。InvocationHandler;

import java。lang。reflect。Proxy;

import java。lang。reflect。Constructor;

import java。lang。reflect。Method;

public class Client

{

static public void main(String[]args)throws Throwable

{

RealSubject rs=new RealSubject();//在这里指定被代理类

InvocationHandler ds=new DynamicSubject(rs);//初始化代理类

Class cls=rs。getClass();

//以下是分解步骤

/*

Class c=Proxy。getProxyClass(cls。getClassLoader(),cls。getInterfaces());

Constructor ct=c。getConstructor(new Class[]{InvocationHandler。class});

Subject subject=(Subject)ct。newInstance(new Object[]{ds});

*/

//以下是一次性生成

Subject subject=(Subject)Proxy。newProxyInstance(cls。getClassLoader(),

cls。getInterfaces(),ds);

subject。request();

}

大B:“通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系。”

同类推荐
  • 初级会计电算化

    初级会计电算化

    本书是作者根据历年会计从业资格考试的考试大纲以及多年对真题的分析,并结合多为专家、学者的实践经验而编写的。本书主要分为八套模拟试卷,以对考生考前的学习进行模拟实战,达到提高考生成绩的目的。
  • 如何操作电脑

    如何操作电脑

    信息社会是科技、文化发展,知识爆炸的结果。不懂得计算机,将处于半文盲的境地。因此,对于计算机,不仅要作为工具使用,已经是一项文化普及的要求。我们不仅要会使用计算机做一些诸如文字处理等具体工作,更要培养一种计算机意识。
  • 高校校园网管理与网上引导工作研究

    高校校园网管理与网上引导工作研究

    在当今的信息化潮流之下,我们不可否认互联网的出现,绝不仅仅是传送手段的变化,更重要的是它代表着一种新的社会形态——网络社会的来临。互联网已经以一种前所未有的方式渗透到现代社会的各个层面和领域,成为现代社会前进和发展的动力和工具,它推动了社会经济、文化政治实现所谓的“数字化转变”。
  • 学校计算机实用技术

    学校计算机实用技术

    本书由杭州市上城区教育学院编著,他们邀请了众多信息技术教育教学的一线专家,认真细致地筛选了学校计算机应用方面的常见问题,提出了解决问题的具体操作方案,旨在帮助一线教育工作者解决可能面临的种种问题,为广大教师提供便捷服务。
热门推荐
  • 神婆玉

    神婆玉

    不死不亡神婆玉。天下第一奇蛊从出生便与她相随,早已融入骨血,觊觎她的人太多,皇族,道士,早已看透世间冷暖的她,能否从这些人的魔掌中逃脱,找到自己的幸福?
  • 总裁的笨蛋秘书

    总裁的笨蛋秘书

    总裁的实习助理出生农村,又笨又不好看。但唯独她能容忍总裁的暴脾气和刁钻野蛮,成功地从实习生转正为贴身秘书。有一天,总裁因为前女友的事对莫小米发大火,莫小米终于抬起了脸:“你为你前女友的事跟我发火?你难道不知道我喜欢你吗?”总裁暴怒:“你每天就是低头做事,有正脸看过我吗?”“公司走了那么多秘书,唯独我留下来了,你难道不知道为什么吗?”总裁:“我让那么多秘书都走了,就留下你,你不知道为什么吗!?笨蛋!”
  • 楚乱汉宫

    楚乱汉宫

    秦楚楚在《汉武大帝》剧组跑龙套,被一件作为道具的巫女服吸引,鬼使神差穿上衣服,时间飞速在她眼前倒退,最后定格在公元前143年。
  • 育儿圣经

    育儿圣经

    作者吉娜·福特认为,从宝宝一出生,父母就应该让他们遵循科学合理的作息规范,这样不但可以让宝宝获得充足的睡眠和奶水,也能使新手父母不至于手忙脚乱,特别是妈妈可以获得充分的休息时间。这本《育儿圣经》,基于作者照看超过300名宝宝的经验,为新手父母提供宝宝不同生长阶段的作息规范建议,告诉你:·怎样迎接宝宝的到来。从早上7点到晚上11点,什么时候宝宝应该吃奶,什么时候应该睡觉,什么时候应该洗澡和玩耍。宝宝出现睡不好、哭泣、饥饿、疲惫等状态,到底是什么原因。妈妈要想重新工作,应该做哪些准备。宝宝在断奶阶段,需要注意哪些细节。妈妈喂养宝宝时,怎样才能让自己获得休息。
  • 试比天

    试比天

    沦陷于妖族的苍澜大陆,人族偏安一隅,受尽欺压已逾千年。凌云,一个从大陆边缘小山村走出的少年,究竟背负着怎样的神秘过往,又会给这片安静了几百年的大陆,带来怎样的波澜?凡武者,欲与青天试比高!
  • 异虫帝国

    异虫帝国

    一个是在实验室受尽折磨的实验品,一个是得罪权贵在贫民区受尽屈辱的盲人,他们因为机缘巧合融为一体,为了各自的复仇创造了宇宙中最强大的种族,最后为了种族的发展而站上了宇宙的舞台。任何伟大的君王都有他们自己的故事,而这部书则讲述了虫族主宰,是如何一步步创造出这强大的种族,又如何建立了这横跨银河系的庞大帝国。他叫郑远征,不过其他种族都叫他征服者。(有读者提醒,特意说一下,这书里的战争会比较残酷,人类遭遇会比较悲惨,不适合未成年和乐观读者,有引起不适的,先说句抱歉了)书友群:695737811
  • 别再为小事抓狂:女人篇

    别再为小事抓狂:女人篇

    身为女人,你是否意识到自己经常抓狂,无论是工作、婚姻、家庭,还是日常生活、人际关系,你总期待自己完美地处理一切,结果压力随之而来,让你感到神经脆弱、异常敏感,一点点小事,就无法控制情绪,产生无数负能量。
  • 从潘德开始的征伐

    从潘德开始的征伐

    在这个时代里,没有人是平庸之人。起义,只是为了迎来更好的时代。杀戮,只是为了保护更多的无辜。平叛,只是为了避免王国的分裂。活着,只是为了看见明天的日出。
  • 雨落筵池

    雨落筵池

    名校高材生遭遇舆论攻击,常年隐藏在身体里的抑郁症暴露无遗,她究竟该相信谁?人心永远比真相可怕。
  • 重生之反派别杀我

    重生之反派别杀我

    万万没想到!曾经人人可欺小胖纸摇身一变成为Y城的大佬令安月更害怕的是曾经的她欺负他是最厉害的那个人安月:我现在补救还来的及吗?朱修远:亲我一下,原谅一次你以前对我的恶行。安月:…………那我还是跑路吧!朱修远:你敢!