【Java】基础54:动态代理,JavaSE最难懂的知识点

今天是刘小爱自学Java的第54天。

感谢你的观看,谢谢你。

话不多说,开始今天的学习:

image

终于还是要学动态代理了,不管多难最终还是得搞定它。

在学它之前,先学习一种设计模式。

一、装饰设计模式

举一个现实里明星和经纪人的例子:

现有一个明星,emm,就叫洛天依吧。

明星是一种身份,很多人都可以是明星,在Java里面可以将其定义成一个接口。

洛天依具体是指某个人,在Java里面可以将其定义成一个类,同时她的身份就是明星,那么实现明星接口就好了。

1LuoTianYi类

image

①创建star接口

这是一个明星接口,有三个抽象方法:

唱歌sing(int money)方法,money就是出场费;

跳舞dance(int money)方法,也需要对应的出场费;

休息Sleep()方法。

不同的明星会有不同的歌和舞,所以使用抽象方法表示。

②创建LuoTianYi类

她是一个明星,所以需要实现star接口,并重写其中的方法,说明自己会唱什么歌,会跳什么舞。

好,现在问题来了,有人要请洛天依唱歌跳舞。

我们都知道明星一般都会有自己的经纪人,一般都是由经纪人出面谈合作。

噔噔蹬蹬,刘小爱闪亮登场了,刘小爱是谁?

他是LuoTianYi的经纪人。

2刘小爱类

image

①创建刘小爱类

类中有一个成员变量Star,构造方法参数为star。

这是什么意思呢?

刘小爱同时是很多明星的经纪人,所以他的参数为star接口,创建该类对象的时候,需要传入star接口的实现类。

找那个明星合作,创建刘小爱对象时说明就好了,这是面向接口编程的核心思想。

②重写Sing()方法

现在有人要谈唱歌合作,那由刘小爱去谈价格,价格不够那不行,价格够了就让对应的明星出场唱歌。

③重写Dance()方法

同样的道理,也是价格谈判,出场费都是1万。

④重写sleep()方法

休息时间,不谈合作。

3测试类

最后一切都设置好了,做一个测试:

image

①创建刘小爱对象

同时说明此时要找哪位明星谈合作,哦,是LuoTianYi。

②说明合作价格

唱歌一万五,跳舞五千。

③控制台输出

唱歌钱够了,所以LuoTianYi开始唱歌了;

跳舞钱不够,所以没有跳舞。

刘小爱这个类就是LuoTianYi这个类的代理。

调用者找洛天依合作,其实是在和刘小爱在谈,在调用者的眼里,刘小爱就是LuoTianYi。

现在合作谈拢了,由谁去执行?由LuoTianYi去执行。

在IO流中,也有和其相似的情况:

image

我们使用的是缓冲字符流,但是缓冲流的底层是由字符流来执行的,那么缓冲字符流就是字符流的代理。

它们都对应Java中的一种设计模式,叫装饰设计模式:

  • 装饰者:缓冲字符流、刘小爱就是装饰者

  • 被装饰者:字符流、洛天依就是被装饰者

  • 装饰者将被装饰者的方法增强了

该设计模式其实和Java中的继承很相似:

  • 父类就相当于被装饰者

  • 子类就相当于装饰者

  • 子类重写方法就是在增强父类的方法

只不过该设计模式在代码层面比继承更具有拓展性。

学习了装饰设计模式,接着开始动态代理的学习。

二、动态代理

装饰设计模式和动态代理很相似,它是一种静态代理。

如何理解静态和动态?

  • 静态:代理类是创建了的,比如例子中的刘小爱

  • 动态:代理类是不用创建的

在Java里有一个类叫Proxy,翻译过来就是代理的意思。

用这个类可以动态构建一个代理类对象:

使用newProxyInstance()方法,该方法是一个静态方法,所以用类名直接可以调用。

将该方法拆分记忆:new 创建;Proxy 代理;Instance 实例化;也就是创建代理对象,很好记。

现在我们来仔细分析该方法的三个参数,看源码:

image

①ClassLoader loader

ClassLoader,类加载器,昨天就接触过。

我们写的类,本质上是.java文件,同时开发工具会自动编译成.class文件,但它们都是存放在硬盘上的。

而类加载器就是将类加载进内存,这样才能够运行。

②Class<?>[] interfaces

interfaces,接口的意思。我个人学Java的一个习惯是先理解这个英文单词是什么意思再去记忆其作用。

并且很多命名规则都是见名知意的。

这个参数就是接口对应的Class对象,什么接口?就是被代理类实现的接口,因为它可以实现很多个接口,所以是一个数组。

③InvocationHandler h

InvocationHandle,翻译过来就是调用处理器。

它是一个接口,我们继续看它的源码:

image

该接口只有一个方法invoke:

  • proxy:这个就是代理对象

  • method:这个也就是代理对象调用的方法(例子中的sing方法、dance方法、sleep方法)

  • args:这个是方法中的参数

好,以上就是对newProxyInstance()方法的说明,完全弄懂了这个方法,也就弄懂了动态代理。

我们现在将代码补全:

image

①被代理类的类加载器

被代理类是谁?例子中就是LuoTianYi,首先要获取它对应的Class对象。

ty.getClass():三种获取Class对象之一,ly是LuoTianYi的对象,利用对象ly的getClass方法。

拿到其对应的Class对象后,可以调用getClassLoader()方法获取对应的类加载器。

Java里面的很多方法看名字就能知道它的作用是什么。

所以ty.getClass().getClassLoader()就是获取被代理类LuoTianYi的类加载器.

②被代理类所实现的接口

同样的道理,见名知意:

ty.getClass().getInterface()就是获取被代理类实现的接口对应的Class对象,例子中就是star这个接口。

③调用处理器

这是一个接口,所以使用匿名内部类创建其实现类对象,同时重写接口中的invoke方法。

这块代码的编写,其实也就是例子中刘小爱这个类对star接口中的三个抽象方法的重写。

这是具体的业务逻辑,根据不同的需求编写不同的代码,其它的代码都是基本不变的。

其中method这个参数:

  • proxy调用sing方法时,method就是sing方法

  • proxy调用dance方法时,method就是dance方法

  • 根据这个我们可以在其中填上方法的具体业务逻辑

④代理类对象 proxy

代理类LiuXiaoAi我们是没有创建的,所以用的是它的父接口star来接受代理类对象,这是多态。

总结:

image

谢谢你的观看。

如果可以的话,麻烦帮忙点个赞,谢谢你。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,100评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,862评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,993评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,309评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,303评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,421评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,830评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,501评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,689评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,506评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,564评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,286评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,826评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,875评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,114评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,705评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,269评论 2 341