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之类加载机制案例讲解

    Java之类加载机制案例讲解

    这篇文章主要介绍了Java之类加载机制案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 浅谈java中String与StringBuffer的不同

    浅谈java中String与StringBuffer的不同

    String在栈中,StringBuffer在堆中!所以String是不可变的,数据是共享的。StringBuffer都是独占的,是可变的(因为每次都是创建新的对象!)
    2015-11-11
  • 数组实现Java 自定义Queue队列及应用操作

    数组实现Java 自定义Queue队列及应用操作

    这篇文章主要介绍了数组实现Java 自定义Queue队列及应用操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot项目防止反编译的方案

    SpringBoot项目防止反编译的方案

    最近项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去,要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译出来,所以本文给大家介绍了SpringBoot项目如何防止反编译,需要的朋友可以参考下
    2024-01-01
  • SpringBoot设置首页(默认页)跳转功能的实现方案

    SpringBoot设置首页(默认页)跳转功能的实现方案

    这篇文章主要介绍了SpringBoot设置首页(默认页)跳转功能,本文通过两种方案,给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Java实现的获取和判断文件头信息工具类用法示例

    Java实现的获取和判断文件头信息工具类用法示例

    这篇文章主要介绍了Java实现的获取和判断文件头信息工具类,结合实例形式分析了Java针对文件读取及头信息判断相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Java算法实现杨辉三角的讲解

    Java算法实现杨辉三角的讲解

    今天小编就为大家分享一篇关于Java算法实现杨辉三角的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java 8 lambda表达式引入详解及实例

    Java 8 lambda表达式引入详解及实例

    这篇文章主要介绍了Java 8 lambda表达式引入详解及实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • 聊聊RabbitMQ发布确认高级问题

    聊聊RabbitMQ发布确认高级问题

    这篇文章主要介绍了RabbitMQ发布确认高级问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • Logger.error打印错误异常的详细堆栈信息

    Logger.error打印错误异常的详细堆栈信息

    这篇文章主要介绍了Logger.error打印错误异常的详细堆栈信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论