java动态代理模式实现原理及实例
发布日期:2021-10-09 15:35:05 浏览次数:1 分类:技术文章

本文共 2216 字,大约阅读时间需要 7 分钟。

代理设计模式

代理设计模式就是引入代理类,客户所有的操作都通过代理类类实现,具体ulm图如下:

在这里插入图片描述
从上图可知,client持有Subject的接口,RealSubject是Subject的真正实现类,而Proxy也实现了Subject,只不过Proxy是通过调用RealSubject去实现相关功能的。

java动态代理实现

java动态代理实现类

由上面代理模式的UML图我们可以知道,代理模式即所有的业务都由代理类去调用,而代理类内部会持有实际接口实现的对象,当我们调用代理接口的方法时,通过代理类调用实际接口实现对象的实现。

那动态代理类就是我们的代理类由相关的类(Proxy)动态生成的,同时我们生成的代理类中会持有InvocationHanlder的实现对象,然后由InvocationHandler的实现类(MyInvocationHandler)通过反射机制去动态的调用代理类接口的实现类(RealSubject)的相关方法。

java动态代理代码实现

1.创建代理类接口Subject

package org.example;/** * @Auth yangyongp * @Create 2020/5/10 13:51 */public interface Subject {  void test();}

2.创建代理接口真正实现类RealSubject

package org.example;/** * @Auth yangyongp * @Create 2020/5/10 13:57 */public class RealSubject implements Subject {  @Override  public void test() {    System.out.println("Test invoke");  }}

3.创建InvocationHandler实现类MyInvocationHandler,用于通过反射机制调用真正实现类的相关方法

package org.example;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * @Auth yangyongp * @Create 2020/5/10 13:52 */public class MyInvocationHandler implements InvocationHandler {  private Object realInvocationObject;  public MyInvocationHandler(Object realInvocationObject){    this.realInvocationObject = realInvocationObject;  }  @Override  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {    Object retrunVal = method.invoke(this.realInvocationObject, args);    return retrunVal;  }}

4.客户类

a.实例化RealSubject类
b.实例化InvocationHandler的实现类MyInvocationHandler,同时MyInovacationHandler中持有了RealSuject的实例类,方便通过反射机制调用RealSubject的相关方法
c.通过java的Proxy类的newProxyInstance()方法创建Subject的代理类即ProxySubject类的实例(proxySubjectInstance),同时传入MyInvocationHandler的实例和Subject接口的class对象和ClassLoader
d.通过代理类实例调用代理接口的相关方法test()

package org.example;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;/** * @Auth yangyongp * @Create 2020/5/10 13:50 */public class ProxyTest {  public static void main(String[] args){    RealSubject realSubject = new RealSubject();    InvocationHandler invocationHandler = new MyInvocationHandler(realSubject);    Subject proxySubjectInstance = (Subject)Proxy.newProxyInstance(ProxyTest.class.getClassLoader(), new Class[]{Subject.class},invocationHandler );    proxySubjectInstance.test();  }  }

转载地址:https://blog.csdn.net/qinwuxian19891211/article/details/106031902 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:maven如何快速查找某个包哪里引入的
下一篇:IDEA中使用Lombok插件

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月12日 02时44分56秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

app运行提示Unable to Initialize Unity Engine 2019-04-27
spring boot 与 Ant Design of Vue 实现修改按钮(十七) 2019-04-27
spring boot 与 Ant Design of Vue 实现删除按钮(十八) 2019-04-27
spring boot 与 Ant Design of Vue 实现角色管理布局以及角色的列表(十九) 2019-04-27
spring boot 与 Ant Design of Vue 实现新增角色(二十) 2019-04-27
spring boot 与 Ant Design of Vue 实现修改角色(二十一) 2019-04-27
spring boot 与 Ant Design of Vue 实现删除角色(补二十一) 2019-04-27
spring boot 与 Ant Design of Vue 实现组织管理布局的实现(二十二) 2019-04-27
spring boot 与 Ant Design of Vue 实现左侧组织树(二十三) 2019-04-27
spring boot 与 Ant Design of Vue 实现新增组织(二十四) 2019-04-27
spring boot 与 Ant Design of Vue 实现修改组织(二十五) 2019-04-27
spring boot 与 Ant Design of Vue 实现删除组织(二十六) 2019-04-27
spring boot 与 Ant Design of Vue 实现获取用户列表(二十七) 2019-04-27
spring boot 与 Ant Design of Vue 实现新增用户(二十八) 2019-04-27
spring boot 与 Ant Design of Vue 实现修改用户(二十九) 2019-04-27
spring boot 与 Ant Design of Vue 实现删除用户(三十) 2019-04-27
spring boot 与 Ant Design of Vue 鉴权体系登录的实现(三十一) 2019-04-27
spring boot 与 Ant Design of Vue 鉴权体系获取用户信息的实现(三十二) 2019-04-27
Druid连接池实现自定义场景的多数据库的连接 2019-04-27
CentOs7命令行(静默)的方式安装oracle数据库 2019-04-27