java动态代理day-01
初识
代理
在日常生活中有,代购、vpn、商家、中介等等;
比如:一家外国大学在中国招生,那么在中国有一家招生中介,这就是这家大学的代理
实例
在开发中,你有a类,需要调用c类的方法完成某个功能,但是c不能让a调用,所以在a和c之间创建一个b代理,c让b访问
登录注册有验证码,验证码是手机短信,但是你没有权力去发短信,这时候需要代理公司向中国移动、中国联通,他们会提供短信发送功能
代理模式是指,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户类和目标对象之间起到中介的作用。
代理的作用
- 功能增强:在你原有功能基础上增加了额外的功能。新增加的功能叫做功能增强
- 控制访问:代理类不让你访问目标
实现代理的方式
-
静态代理:
代理类是自己手工实现的,自己需要创建java类来表示代理类,同时所要代理的类是确定的,目标确定
一个用户买u盘,商家就是u盘品牌的代理,u盘厂家是目标
用户(客户端)–商家(代理)–厂家(目标)
创建步骤
- 创建一个接口,定义卖u盘的方法,表示你的厂家和商家做的事情
- 创建厂家类,实现1步骤接口
- 创建商家代理,实现1步骤接口
- 创建客户端类,调用商家方法买u盘
代理类完成的功能:
-
目标类中方法的调用
-
功能增强
-
创建一个接口
package proxy_henry.service; public interface UsbSell { /** * * @param amount 数量 * @return 价格 */ float sell(int amount); }
-
创建厂家类
package proxy_henry.factory; import proxy_henry.service.UsbSell; /** * 金士顿厂家,不接受用户单独购买 */ public class UsbKingFac implements UsbSell { @Override public float sell(int amount) { return 85.0f; } }
-
创建商家代理
package proxy_henry.shangjai; import proxy_henry.factory.UsbKingFac; import proxy_henry.service.UsbSell; public class taobao implements UsbSell { private UsbSell factory = new UsbKingFac(); @Override public float sell(int amount) { float price = factory.sell(amount);//厂家的价格 price += 25;//商家加价,增强功能 return price; } }
-
创建客户端类
package proxy_henry.ShopMan; import proxy_henry.shangjai.taobao; public class shopman { public static void main(String[] args) { taobao tb = new taobao(); float price = tb.sell(1); System.out.println(price); } }
-
动态代理
在静态代理中目标类很多时,可以使用动态代理,避免静态代理的缺点
在动态代理中目标类即使很多,代理类可以很少,而且修改接口中方法时不会影响代理类
动态代理是在程序执行的过程中,使用jdk的反射机制,创建代理类对象,并且动态的指定要代理的目标类,简而言之动态代理是一种创建Java对象的能力,让你不用创建taobao类就能创建代理类对象