A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王光保 黑马帝   /  2011-7-16 18:35  /  3143 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家都知道如果要想实现JDK中自己带的动态代理,必须要有实现类接口才可以实现,而没有实现类的接口,只能用cglib生成字节码来实现。但就是不理解为什么就要有接口呢?百思不得其解。

评分

参与人数 1技术分 +3 收起 理由
admin + 3 你是爱思考的童鞋,将来会有比较高的成就!

查看全部评分

6 个回复

倒序浏览
黑马网友  发表于 2011-7-16 19:16:56
沙发
Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。   Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现。OOP面向对象的编程,如果要提高程序的复用率,增加程序的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程,正确地使用接口、抽象类这些太有用的抽象类型做为你结构层次上的顶层。   Java接口和Java抽象类有太多相似的地方,又有太多特别的地方,究竟在什么地方,才是它们的最佳位置呢?把它们比较一下,你就可以发现了。   1、Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。   2、一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。   3、从第2点不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-16 19:37:00
藤椅

动态代理技术必须要有接口的理解

JDK中的定义:动态代理类是一个实现在创建类时在运行时指定的接口列表的类。
个人理解,比如一个人买电脑,除了从厂家直接买,也可以从代理商处买,代理商处又不产电脑,为什么要从代理商处买啊?总得有一个理由啊,代理商处买我就不用跑那么远,花几百元路费了吧(不能空有一个类吧,类中必须有一个方法吧,创建个类还得再说明其中有这样那样的方法,还不如直接实现一个接口,它其中的方法就都可以调用实现了)。
选择在代理商处购买的理由可以只有一个,也可以有很多个,比如这个代理商是个美女,说话很甜,而厂家接电话的人态度很差,代理商还可以送货上门等等,理由不止一个的话,我们还得一个个写类及方法,那样多麻烦。还不如就先对这个人做个接口,这个接口中描述一些他除购买电脑以外的需求,买电脑的人家态度要好,给我们送货,价钱还不要太贵等等,购买电脑时我们调用这个接口就行。这次买联想电脑,那下次这个人买华硕电脑的话,我们直接调用这个接口不就是很方便么?
参考:张老师视频讲解Java基础加强视频,49_分析代理类的作用与原理及AOP概念中第15分钟讲过

评分

参与人数 1技术分 +2 收起 理由
admin + 2 很认真啊!!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-17 10:21:29
板凳
wangguangbao 同学问得好啊,同学们多参与,多思考
回复 使用道具 举报
黑马网友  发表于 2011-7-17 14:08:26
报纸
来说说我的理解。
目前如果我们要生成一个动态类,必须是指定这个动态代理类实现了哪些接口。我想这是在一开始JAVA设计人员实现了动态代理的功能,一个动态类实现若干个接口然后进行封装,相对比较简单。但是如果要是不需要接口的代理,可能要考虑比如说这个类是否是final等信息,开发出这个功能需要对class的文件格式指令集进行复杂设计,因此当初就没有实现。
但是后来出现cglib,有了这个开源项目,具体什么机制不清楚,可能是一些非常熟悉class的人开发的一个项目,可以对没有接口的类实现创建动态代理类,所以总体上看,不是已经“不需要必须有接口了么”。
按照张老师的话,cglib现在还不是JAVA官方的,但是根据这东西的性质,未来的几个版本迟早会成为官方承认的。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-18 10:14:56
地板
动态代理需要代理它所代理对象的所有方法,而实现这个功能最好的就是实现其接口

评分

参与人数 1技术分 +1 收起 理由
admin + 1 有自己的观点很好

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-18 12:11:33
7#
可以没有接口呀,没有接口不就通过类(cglib)创建代理了,之所以使用通过接口创建代理是因为在目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。该类让spring动态产生一个新类,它实现了所需的接口,织入了通知,并且代理对目标对象的所有请求。如果你需要代理一个类而不是代理一个或是更多接口,在这种情况下,你可以配置Spring使用cglib代理。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马