登陆注册
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类)也可以动态改变,从而实现了非常灵活的动态代理关系。”

同类推荐
  • FlashCS动画制作基础

    FlashCS动画制作基础

    适合爱好flash动画制作的初、中级读者作为入门学习的参考书,还可以供从事网页制作与动画设计的人员参考,同时也可以作为初、中级电脑短训班的培训教材,对有一定经验的flashcs5使用者也有很高的参考价值。
  • 都是网络惹的祸

    都是网络惹的祸

    本书分网络游戏、网络聊天、网络隐私、网络网吧安全、网络文化、网络语言、网络犯罪、网络陷阱等栏目,从不同的视角探讨了在当今社会的网络现象。
  • 网络广告经纪人

    网络广告经纪人

    本书为网络广告经纪人培训认证的指定教材,该认证是商务部中国商务广告协会和信息产业部中国电子商会联合推出的,旨在为国家造就和培养出一大批网络广告梯队型人才。该教材包括网络广告经纪人的介绍和发展趋势,以及网络广告的原理、策划、设计、制作、发布与交换、效果评估、管理,以及网络广告营销的国内外最新的成功案例,还提供了一些常用的网络广告制作工具。本教材适合助理网络广告经纪人和网络广告经纪人层次使用。也可作为高校广告、电子商务等专业的教材。
  • 科学伴你行-神奇的通信技术

    科学伴你行-神奇的通信技术

    在日常生活中,有时人们要借助于小旗子来进行通信联络,比如,开运动会时,发令员常常要用小旗子与计时员联系;当你乘坐火车进入车站时,都会看到车站工作人员拿着红色和绿色的小旗子在站台上进行指挥;在战争中,打出白色旗子表示投降,插上红色旗子表明胜利;航行在茫茫大海上的船只,双方船员会凭不同旗帜组成的标志,来了解对方的意思。以上种种用小旗子来“说话”的通信方式就叫做旗语。
  • 纵横于天地之间——互联网络技术

    纵横于天地之间——互联网络技术

    本书告诉你:不管你是谁,只要生活在当前的时代,你一定知道电话,知道电脑,知道上网……知道许许多多关于电子、关于计算机、关于网络的话题,这就是网络时代。网络的话题可多了:它是怎么来的?什么是“蜘蛛网”?网络的过去和现在,上网的方法,如何使用网络,互联网的安全,网络有“陷阱”吗?网络有“瘾”吗?网络文化和未来又是怎样的?到书中去找答案吧!
热门推荐
  • 最后一位黑客在仙域

    最后一位黑客在仙域

    弹指间,天崩地裂,一念间,时空幻灭。仙幻荒域,有三十六重仙域,七十二重荒域大世界。这里修士之间的战争毁天灭地,处处都是焦土与哀鸣,谁也无法在这乱世之中逍遥自在,谁也无法在这里踏上巅峰之路!直到有一天,一个重生而来的黑客少年,带着他的万能工具和师傅凯老踏出宗门。凭借着万能工具的搜索,采集,炼药,炼器……渐渐的构筑出一个让家人朋友,都能够安全修炼的世界。微系统流,敬请关注!
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 异世剑武

    异世剑武

    千年前,武圣十方无敌舍弃自身,封印魔族,留下十大绝学黯然而去,从此天元大陆有了十种武功,但剑法却因十方无敌九大弟子争夺十种绝学,破碎消失,从此玄武大陆剑法衰落,地球人曹鲁从二十一世纪穿越而来,带着众多武侠小说中全部剑法穿越而来,看他以贱贱的样子构造一个剑的世界。
  • 诸天之神秘国度

    诸天之神秘国度

    诡怪、凶兽、傀儡妖物横行世间,符纹、武道于人类手中崛起。人类从未如此弱小过,又从未如此强大。异风吹来,迷雾笼罩,弱者无声中消失,强者迎难而上。当穿越者临近大地,世间的迷雾被打开了一角。
  • 余生很长,有你不慌

    余生很长,有你不慌

    霍一航对我说:“嫁给我,我钱多,颜高!”“我们可以强强联合,将曾经欺负过我们的人,虐的哭爹喊妈。”
  • 钻石婚夜

    钻石婚夜

    不要,分看。“钰清,我爱你。”“呵呵,不用你爱。”
  • 斗罗之虚族降临

    斗罗之虚族降临

    本书的世界不会只有斗罗,至于其他世界还没定下来,这也不是穿越,系统流,主角只是破界来游历世界的,同时主角力量已达超级宇宙的顶峰,本书内容属于魔改
  • 仙道双骄

    仙道双骄

    仙路路漫漫,看两个少年的修仙之路。奇遇,法宝,仙术,让我把废物的名头踩在脚下吧!欲寻仙,先寻人!
  • 冷酷校草,甜心丫头跟我走

    冷酷校草,甜心丫头跟我走

    【黑道+贵族+校园+虐渣】(原名《贵族少女的爱罗曼史》)爱情,一个那些人根本没有想过的名词,却无意中闯入了他们的生活。她,性格淡漠,悲惨的童年揭开时,她才得知原来自己有个美好的家;他,四大家族之子,对人冷酷,但却因为她,释放了自己另一面。她表面上大大咧咧没心没肺,但是却是在隐藏自己的心;他一次次的惹她生气,慢慢的才发觉,原来自己早已动情。【青春浪漫,贵族校园,冰晶绮舞。两男两女,1v1】
  • 雨神的传承

    雨神的传承

    转世而来的洛雨将会有怎样的历程呢。这个世界没有修仙者,有玄气练体的人类与魔兽,还有稀有的一出生就会使用魔法的龙族,而万中无一的是会用魔法的人类了。