当前位置: 首页>后端>正文

JDK的动态代理(个人学习记录)

什么是代理模式/代理?

?????? 代理模式:代理模式是一种是现实思想,Java我们通常通过new一个对象然后调用其对应的方法来访问我们需要的服务。代理模式则是通过创建代理(proxy)的方式来访问服务,代理类通常会持有一个委托类对象,代理类不会自己实现真正服务,而是通过调用委托类对象的相关方法,来提供服务,所以其实我们调用的还是委托类的服务,但是中间隔了一个代理类,使得我们可以在访问服务之前或者之后添加我们需要的操作。而静态代理跟动态代理就是衍生出来的两种代理模式

JDK的动态代理(个人学习记录),第1张
示意图

静态代理

①静态代理: 静态代理就是程序员在编写代码的时候就已经把代理类的源码写好了

现在我们对静态代理进行编码实现

1.先写一个Person接口

JDK的动态代理(个人学习记录),第2张
Person接口

2.然后再编写一个Student来实现Person接口,并且拥有一个方法dowork

JDK的动态代理(个人学习记录),第3张
Student实现Person接口

3.接着我们编写静态代理StaticProxy

JDK的动态代理(个人学习记录),第4张
静态代理StaticProxy

?????? 从这里我们可以看到这个静态代理的代理类StaticProxy已经获取到了我们想要访问的对象Person,并且重写了方法dowork,可以发现这个方法相比起原来的方法多了System.out.println("开始学习")跟System.out.println("休息")两条语句并且不影响原本的person的dowork输出

4.然后我们编写测试类

JDK的动态代理(个人学习记录),第5张

5.查看结果

JDK的动态代理(个人学习记录),第6张

??????? 到这里代理最大的用处已经体现出来了,相比起直接访问,静态代理可以在避免直接对真实业务对象的访问的同时对方法进行进一步编写

动态代理

②动态代理:相比静态代理不需要事前给目标类编写代理代码,而是在巡行中通过反射自动生成代理代码,在编码实现动态代理之前我们先介绍一下InvocationHandler接口Proxy类

1.InvocationHandler接口是实现动态代理的核心,InvocationHandler接口拥有invoke方法,每当我们通过动态代理对象调用一个方法的时候,这个方法就会被转发到实现,InvocationHandler接口类的方法invoke,下面是invoke方法

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;

2.Proxy类就是用来创建换一个代理对象的类,在它提供的许多方法中我们最常用的是newProxyInstance,下面是newProxyInstance方法:?

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

这个方法接收三个参数

loader:一个classloader对象,定义了由哪个classloader对象对生成的代理类进行加载

interfaces:一个interface对象数组,表示我们将要给我们的代理对象提供一组什么样的接口,如果我们提供了这样一个接口对象数组,那么也就是声明了代理类实现了这些接口,代理类就可以调用接口中声明的所有方法

h: 一个InvocationHandler对象,表示的是当动态代理对象调用方法的时候会关联到哪一个InvocationHandler对象上,并最终由其调用

3.然后是编码实现

JDK的动态代理(个人学习记录),第7张

4.编写测试类

JDK的动态代理(个人学习记录),第8张

5.运行结果

JDK的动态代理(个人学习记录),第9张

当我们调用代理对象中的任何一个方法就会想前面说的一样自动调用invoke来实现对方法进行进一步编写。可以看出,我们并没有专门为Person编写代理对象,但是它却实现了静态代理的功能,显而易见相比静态代理而言动态代理可以更灵活的生成代理对象。

资料来源:

SpringAOP(图文详解):https://blog.csdn.net/lhj520cb/article/details/125820513

java动态代理:https://blog.csdn.net/qq_34609889/article/details/85317582

java基础-代理(proxy):https://www.zhankr.net/25224.html

Java面试必知必会.Java基础.05.动态代理(JDK/CGLIB): https://www.bilibili.com/video/BV1cz41187Dk

Java动态代理InvocationHandler和Proxy学习笔记:https://blog.csdn.net/yaomingyang/article/details/80981004


https://www.xamrdz.com/backend/3y41923511.html

相关文章: