初步理解JDK动态代理

一、JDK动态代理是什么
使用jdk的反射机制,创建对象的能力,创建的是代理类的对象,而不用你创建类文件,不用写java文件。动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。
动态代理:基于反射机制。
在开发中,可能有这种情况:
有一个A类,本来是调用C类的方法来完成某个功能,但是C不让A调用,那么就要:在A和C之间,创建一个b代理,C让b访问,a–>访问b–>访问C。
使用代理模式的作用:
1、功能增强:在原有的功能上,增加了额外功能,新增加的功能叫做功能增加。
2、控制访问:代理类不让你访问目标,例如商家不让用户访问厂家
实现代理的方式:静态代理,动态代理。
静态代理:代理类是自己手工实现的。自己创建一个JAVA类,表示代理类,同时你所要代理的目标是确定的。
优点:实现简单,理解容易。
缺点(当项目中代理类和目标类很多的时候):1、当目标类增加了,代理类可能也需要成倍增加,代理类数量过多
2、当你的接口中功能增加了,或者修改了,会影响众多的实现类,都需要修改。影响比较多。

用户—商家—厂家
实现步骤:
1、创建一个接口,定义卖U盘的方法,表示厂家和商家要做的事情。
2、创建厂家类,要实现1步骤的接口。
3、创建商家,要实现1步骤的接口。
3、创建客户端类,调用商家的方法,买U盘

动态代理:在静态代理中目标类很多时,可以使用动态代理,避免静态代理的缺点。
在动态代理中目标类即使很多,代理类数量可以很少;当你修改了接口中的方法时,不会影响代理类。
动态代理:在程序执行过程中,使用jdk反射机制,创建代理类对象,并动态的指定要代理目标类。

在java中,要想创建对象:
1、创建类文件,java文件编译为class
2、使用构造方法,创建类的对象。

动态代理的分类:1、JDK动态代理:使用java反射包中的类和接口实现动态代理的功能。
反射包:java.lang.reflect.里面有三个类:InvocationHandler, Method, Proxy
2、cglib动态代理:cglib通过继承目标类,创建它的子类,在子类中重写父类中同名的方法,实现功能的修改。
因为cglib是继承,重写方法,所以要求目标类不能是final的,方法也不能是final的。
cglib要求目标类比较宽松,只要能继承就行了,在很多框架中使用。比如mybits, spring 框架中使用。

jdk动态代理:
1、反射,method类,表示方法。类中的方法,通过method可以执行某个方法。
2、jdk动态代理的实现:
反射包:java.lang.reflect.里面有三个类:InvocationHandler, Method, Proxy
1)、InvocationHandler是个接口,只有一个方法,叫做invoke(),invoke()表示代理对象要执行的功能代码。你的代理类要完成的功能就写在invoke()方法中。代理类完成的功能第一点:调用目标方法,执行目标方法功能。第二点:功能增强,在目标方法的调用时,增加额外的功能。
这个接口表示你的代理要干什么。
方法原型:public Object invoke(Object proxy,Method method,Object[] args)
Object proxy :jdk创建的代理对象,无需赋值。
Method method :目标类中的方法,jdk提供method对象。
Object【】 args :目标类中方法的参数。
怎么用:1、创建一个类,实现InvocationHandler接口
2、重写invoke()方法,把原来静态代理中代理类要完成的功能,写在这。

2)Method类:表示方法的,确切的说就是目标类中的方法,通过method可以执行某个目标类的方法。Method.invoke();
method.invoke(目标对象,方法的参数)
method.invoke()就是用来执行目标方法的。
3)、proxy类:核心的对象,创建代理对象,之前创建对象都是new类的构造方法,现在我们是使用proxy类的方法,代替new的使用。
方法:静态方法:newProxyInstance()
原型:public static object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
ClassLoader loader:类加载器,负责向内存中加载对象,使用反射获取对象的(ClassLoader。
Class<?>[] interfaces:是接口,目标对象所实现的接口,也是反射获取的。
InvocationHandler h:我们自己写的,代理类要完成的功能。
返回值是代理对象。
二、实现动态代理步骤
1、创建接口,定义目标类要完成的功能
2、创建目标类实现接口
3、创建InvocationHandler接口的实现类,在invoke()方法中完成代理类的功能
1)调用目标方法
2)增强功能
4、使用Proxy类的静态方法,创建代理对象,并把返回值转为接口类型。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mingshengda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值