动态代理(理解即可);基于反射机制
掌握的程度;1.知道什么是动态代理? 2.知道动态代理能做什么?可以在不改变原来目标方法的前提下,可以在代理中增强自己的功能代理,在程序开发中的意义,比如,你所在的项目中是其他人(公司小组其他人)写好的,但是不能完全满足自己的项目,需要自己增加代码,这时用代理实现;实现了功能增强,而且还进行了功能增强;
1.代理
代购,中介,商家等等
比如有一家美国大学,可以对全世界招生,留学中介(代理)
代理特点:
1.中介和代理他们要做的事情是一致的,招生
2.中介是学校代理,学校是目标
3.家长--中介(学校介绍,办理入学手续)--美国学校
4.中介是代理,不能白干活,需要收取费用
为什么要找中介?
1.中介是专业的,方便
2.家长现在不能自己去找学校,家长没有能力访问学校,或者美国学校不接受个人来访
买东西都是商家卖,商家是某个商品的代理,你个人买东西,肯定不会让你接触到厂家
在开发中也有这样的情况,你有a类,本来是调用c类方法,完成某个功能,但是c类不能调用,这时我们创建一个b代理,c让b访问,a就可以访问b,b访问c
实际的例子中,登录,注册有验证码,验证码是手机短信,但是只有中国移动,联通或者电信公司能发短信,这些公司有子公司,他们面向社会提供短信发送功能;
张三项目发送短信--子公司--中国移动,联通或者电信(代理模式)
使用代理模式的作用
1.功能增强,在原有的功能上增加额外的功能
2.控制访问,代理类不让你访问目标,例如商家不让你访问厂家
实现代理的方式
1.静态代理:代理类是自己手工实现,自己创建一个Java类表示代理类,同时你所要的目标类是确定的,特点:实现简单,容易理解
缺点;当目标类增加了,代理类可能也需要成倍增加,当接口方法增多,会影响很多实现类,厂家和商家都需要修改
模拟用户购买u盘,用户是客户端类,商家是代理,厂家是目标类; 三者关系:用户(客户端)--商家(代理)--厂家(目标)
商家和厂家的功能是一致的,都是卖u盘
实现步骤:
1.创建一个接口来定义卖U盘的方法,表示厂家和商家要做的事情;
2.创建厂家类,实现接口
3.创建商家,实现接口
4.创建客户端类,调用商家的方法买U盘
2.动态代理(重点):在程序执行过程中,使用JDK的反射机制,创建代理类对象,并动态的指定目标类;换句话说,动态代理是一种创建Java对象的能力,让你不用创建类,也能创建对象;
在静态代理中目标类很多时,可以使用动态代理,避免静态代理的缺点,动态代理中目标类即使很多,代理类数量可以很少,当你修改了接口的方法,不会影响代理类
动态代理:1.JDK动态代理(理解):使用Java反射包中的类和接口实现动态代理的功能
2.cglib动态代理(了解):它是第三方的工具库,创建代理对象,原理是继承,它通过继承目标类,创建它的子类,在子类中重写父类中同名的方法,实现功能的修改,它要求目标类不能是final,对目标类要求低,只需要能继承就可以了, 在很多框架中使用(Spring,mybatis)
JDK动态代理:
1.反射,Method类,类中的方法,通过Method可以执行某个方法。
2.JDK动态代理实现:反射包:Java.lang.reflect 里面有三个类,InvocationHandle,Method,Proxy
1)InvocationHandle接口:就一个方法invoke(),表示代理对象要执行的功能代码,你的代码类要完成的功能就写在这个方法中
代理类要完成的功能;1.调用目标方法,执行目标方法的功能 2.功能增强,在目标方法调用时,增强功能;
InvocationHandle接口:表示你的代理要做什么
怎么用;1.创建类实现接口InvocationHandle 2.重写invoke方法,把原来静态代理中代理类要完成的功能写在这里
Method类:表示方法的,确切的说是目标类中的方法
作用:通过Method可以执行某个目标类的方法
Proxy类:核心的对象,创建代理对象,之前创建对象都是new类个构造方法,现在使用Proxy类的方法,代替new的使用
方法 静态方法 newProxyinstance() 创建代理对象,