java动态代理

动态代理是基于反射机制的

1.什么是动态代理
1.什么是代理
假设有个A类需要调用C类的方法来完成某个功能,但C类不允许A类调用,
那么在A和B之间创建一个B代理,B可以访问C,则A访问B,B访问C,C返回信息给B,B给A
2.代理的作用
1.功能增强:在原有功能上,增加了额外功能,新增加的功能,叫做功能增强
2.控制访问:代理类不让客户直接访问目标
3.实现代理的方式
1.静态代理: 1)代理类是自己手动实现的,自己创建一个java类,表示代理类,
2)同时你所要代理的目标类是固定的
特点:1)实现简单,2)容易理解
缺点:1)目标类增加,代理类也会增加;
2)在接口中增加方法,所有实现这个接口的类都需要修改

		模拟用户买U盘行为
			用户:客户端类
			商家(代理):代理商
			厂家:目标类
		实现步骤:
			1.创建一个接口,定义卖U盘的方法,表示厂家和商家的事情
			2.创建厂家,实现1步骤接口
			3.创建商家,就是代理,也需要实现1步骤中的接口
			4.创建客户端类,调用商家的方法买一个U盘
		代理类完成的功能:
			1.目标类中方法的调用
			2.功能增强

	2.动态代理:
		在静态代理中目标类很多时,可以使用动态代理,避免静态代理的缺点。
		动态代理中目标类即使很多,1)代理类数量可以很少,2)当修改了接口中的方法时,不会影响代理类
	
		如何使用动态代理:
		在程序执行的过程中,使用jdk的反射机制,创建代理类对象,并动态指定要代理的目标类。
		换句话说,动态代理是一种创建java对象的能力,让你不用创建taobao类,就能创建代理类对象

		在java中,要想创建对象:
		1.创建类文件,java文件编译为class
		2.使用构造方法,创建类的对象。
4.什么是动态代理
	使用jdk反射机制,创建对象的能力,创建的是代理类的对象,而不用你创建类文件,不用写java文件。
	动态:在程序执行时,调用jdk提供的方法才能创建代理类对象

5.动态代理的实现
	1.jdk动态代理:使用java反射包中的类和接口实现动态代理的功能
					java.lang.reflect,里面有三个类:InvocationHandler,Method,Proxy
	
	2.cglib动态代理:cglib(Code Generation Library)是第三方的工具库,创建代理对象。
					cglib的原理是继承,cglib通过继承目标类创建它的子类。在子类中重写父类同名的方法,
					实现功能的修改。
					因为cglib是继承,重写方法,所以要求目标类不能是final的,方法也不能是final的。

2.jdk反射机制
1.反射,Method类,表示方法。类中的方法。通过Method可以执行某个方法
2.jdk动态代理的实现
反射包java.lang.reflect,里面有三个类,Method,InvocationHandler,Proxy
1)InvocationHandler接口(调用处理器),就一个方法invoke()
invoke()表示代理对象要执行的功能代码
2)Method()执行某个目标类的方法,Method.invoke()
3)Proxy类:创建代理对象。之前创建对象都是new对象,用Proxy代替new
方法:静态方法 newProxyInstance()
作用:创建代理对象
参数:
1.ClassLoader 类加载器,负责向内存中加载对象。使用反射机制获取对象ClassLoader
例如对于类A,A.getClass().getClassLoader() 目标对象的类加载器
2.Class<?> interfaces:接口,目标对象实现的接口妈也是反射获取的
3.InvocationHandler h:程序员编写,代理类要完成的功能
返回值:就是代理对象

			public static Object newProxyInstance(ClassLoader loader,
												Class<?>[] interfaces,
												InvocationHandler h)

3.实现动态代理的步骤
1.创建接口,定义目标类要完成的功能
2.创建目标类实现接口
3.创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能
1.调用目标方法
2.功能增强
4.使用proxy类的静态方法创建代理对象,并把返回值转为接口类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值