Java中JDK动态代理的超详细讲解

 更新时间:2022年10月21日 08:58:54   作者:白胡子永远  
JDK 的动态代理是基于拦截器和反射来实现的,JDK代理是不需要第三方库支持的,只需要JDK环境就可以进行代理,下面这篇文章主要给大家介绍了关于Java中JDK动态代理的超详细讲解,需要的朋友可以参考下

1. 什么是动态代理?

动态代理是通过创建代理对象,在不改变原有代码的基础上,给程序增加新的功能,实现了程序的功能增强。

2.动态代理的实现方式有几种?

  • JDK动态代理
  • CGLB动态代理

3. JDK动态代理

使用了JDK中的InvocationHandler接口,Method类和Proxy类。JDK的动态代理的要求:目标类必须要有接口。(目标类就是那个我们需要增强功能的方法所在的那个类,也是接口实现类所在的类)。我们通常回给目标类中要增强的方法增加上日志,事务等非业务功能。

4. CGLB动态代理

CGLB动态代理即Code Generation Library,是一个开源的第三方工具库,其原理是继承,去生成目标类的子类对象,这样对子类的功能进行增强。但是要求:目标类不能用final修饰,目标类中的方法也不能被final修饰。

5.动态代理的效率

CGLB动态代理的效率要大于JDK动态代理的效率。

6.为什么要使用动态代理呢?

设计出来动态代理是为了解决一定的需求,因为在我们实际的开发过程中,经常会遇到,要给写好的某个方法的前面或者是后面增加方法,甚至是给好几个类的方法增加新的功能。若是我们直接在方法上写上新的增加的方法,就会显得很乱,而且很冗余。

那么我们初步改进可以通过写一个工具类去解决,在一个工具类中写上我们要增强的方法,但是要求这些增强的方法是静态修饰的,这样我们就可以在原有的代码上,使用类名.方法名的方式,来给原有的功能增加新的功能。这样一定程度上的解决了代码混乱的程度,但是还是不太完美。

再次改进:这个时候就是使用动态代理。

这就体现了动态代理的优势,即在不修改任何原有代码的情况下,实现给原有功能的增强。

7. JDK动态代理详细使用介绍

由于我们在Java项目中,直接使用动态代理的地方不多,所以我们都是使用的aspectj框架中写好的动态代理。aspectj框架中的动态代理就是封装的JDK动态代理。

下面将仔细介绍使用JDK动态代理的步骤:

  • 最好可以先创建一个工具类,将要增强的功能先写好,这样我们便可以一句代码能调动这个用来增强的功能。
  • 自定义类,去实现InvocationHandler接口,并且,重写invoke()方法。
  • 在这个自定义的类中,添加Objeck属性,并且写上有参的构造方法。
  • 在invoke()方法中写上如下代码

然后去主类中,使用动态代理,实现功能的增强。

注意:

上面的JDK动态代理的原理是反射机制。

我们可以使用proxy.getClass().getName()看到的值为com.sun.proxy.$Proxy

总结

到此这篇关于Java中JDK动态代理的文章就介绍到这了,更多相关Java JDK动态代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 教你怎么用Java操作Redis

    教你怎么用Java操作Redis

    今天带大家来学习怎么用Java操作Redis,文中有非常详细的介绍,对正在学习java的小伙伴们有很好的帮助,建议有redis基础并熟悉redis的基本数据类型命令的小伙伴学习,需要的朋友可以参考下
    2021-05-05
  • Java的异常体系以及File类构造方法详解

    Java的异常体系以及File类构造方法详解

    这篇文章主要为大家介绍了Java的异常体系以及File类构造方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 详解如何通过Java实现类似Nginx代理

    详解如何通过Java实现类似Nginx代理

    最近遇到一个问题,在内网环境中部署的项目需要调用外网完成一些应用,一般情况我们可以通过增加一台机器,部署到可以访问外网的服务器上,然后内网直接连接该机器通过Nginx进行代理即可,所以本文介绍了如何通过Java实现类似Nginx代理,需要的朋友可以参考下
    2024-08-08
  • Java容器类源码详解 Deque与ArrayDeque

    Java容器类源码详解 Deque与ArrayDeque

    这篇文章主要介绍了Java容器类源码详解 Deque与ArrayDeque,Deque 接口继承自 Queue接口,但 Deque 支持同时从两端添加或移除元素,因此又被成为双端队列。,需要的朋友可以参考下
    2019-06-06
  • Java在长字符串中查找短字符串的实现多种方法

    Java在长字符串中查找短字符串的实现多种方法

    这篇文章主要介绍了Java在长字符串中查找短字符串的实现多种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java实现经典游戏超级玛丽的示例代码

    Java实现经典游戏超级玛丽的示例代码

    在你的童年记忆里,是否有一个蹦跳、顶蘑菇的小人?本文将用java语言实现经典游戏《超级玛丽》,文中采用了swing技术进行了界面化处理,需要的可以参考一下
    2022-02-02
  • springboot后端配置多个数据源、Mysql数据库的便捷方法

    springboot后端配置多个数据源、Mysql数据库的便捷方法

    实现springboot 后端配置多个数据源、Mysql数据库,只需要新建 Mapper、实体类 相应的文件夹,将不同数据源的文件保存到对应的文件夹下,添加绑定数据库配置Config,就可以轻松完成
    2021-08-08
  • Java使用sftp定时下载文件的示例代码

    Java使用sftp定时下载文件的示例代码

    SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。接下来通过本文给大家介绍了Java使用sftp定时下载文件的示例代码,感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-05-05
  • SpringBoot整合Thymeleaf的方法

    SpringBoot整合Thymeleaf的方法

    这篇文章主要介绍了SpringBoot整合Thymeleaf的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • JavaEE中struts2实现文件上传下载功能实例解析

    JavaEE中struts2实现文件上传下载功能实例解析

    这篇文章主要为大家详细介绍了JavaEE中struts2实现文件上传下载功能实例,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论