Dynamic Proxy of JDK and Cglib

2024-06-06 18:08
文章标签 jdk dynamic proxy cglib

本文主要是介绍Dynamic Proxy of JDK and Cglib,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. JDK

动态生成Class来实现target的所有接口,具体实现为nvocationHandler的invoke。


2. Cglib

动态生成Class来继承target,具体实现方法分两种:

一: 与原实现方法同名的,实现为Custom CALLBACKS>THREAD_CALLBACKS>STATIC_CALLBACKS的顺序去调用对应的intercept方法

二: 修改原实现方法名字为类似CGLIB$Method_Name$0, 实现为直接调用super class(即:target 对应的class)


3. 比较

JDK有实现相对简单,有不少缺点:

a. target必须实现接口

b. target本身的方法之间调用不会触发nvocationHandler的invoke方法,这是因为jdk本身设计上的缺陷,在写横切逻辑时,我们是直接用的target去调用对应的方法,因此内部调用还是target类本身,与Proxy没有任何关系。这也直接导致spring aop有同样的问题


Cglib实现相对复杂,JDK提到的缺点都是Cglib的优点:

a. Cglib采用的extends方式

b. Cglib在写横切逻辑时,一般写法是proxy.invokeSuper(obj, args); 这里的invokeSuper会调用之前提到的CGLIB$Method_Name$0,从而间接的调用了target的实现方法,但是此时所处的对象仍然是Proxy。所以调用本身的其他方法时会调用被proxy override的同名method(这是由于jvm的动态分派 invokevirtual 指令),因此又会触发Custom CALLBACKS。





这篇关于Dynamic Proxy of JDK and Cglib的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036841

相关文章

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

mac jdk 1.7 dmg 官方版

百度云下载 https://pan.baidu.com/s/1SQiidrPFF5aZr4xlx0ekoQ https://pan.baidu.com/s/1SQiidrPFF5aZr4xlx0ekoQ   补充说明: 实际上oracle对于历史版本的jdk都有归档可以在官方网站上下载,只是需要注册个号就可以了。 地址如下: https://www.oracle.com/cn/java

proxy代理解决vue中跨域问题

vue.config.js module.exports = {...// webpack-dev-server 相关配置devServer: {host: '0.0.0.0',port: port,open: true,proxy: {'/api': {target: `https://vfadmin.insistence.tech/prod-api`,changeOrigin: true,p

配置Java(JDK)环境变量

一、配置JDK环境变量 将JDK-22压缩包加压缩到指定目录下面,本机路径是:C:\Program Files\Java(可以加压缩到自己的指定路径,记住这个路径,配置环境变量时候要使用)。 鼠标右键“此电脑”,点击“属性”,点击“高级系统设置”,然后进入“环境变量”。 点击“新建”,然后变量名填“JAVA_HOME”,变量值填自己的JDK的下载路径,我这里是“C:\\P

docker学习系列(四)制作基础的base项目镜像--jdk+tomcat

前面已经完成了docker的安装以及使用,现在我们要将自己的javaweb项目与docker结合 1.1准备jdk+tomcat软件 ​​我下载了apache-tomcat-7.0.68.tar.gz和jdk-7u79-linux-x64.tar.gz,存储于Linux机器的本地目录/usr/ect/wt/下(利用xshell上传)。利用linux命令 tar -zxvf apache-tom

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes 优势 1、构建了一个用于监督原始视频去噪的基准数据集。为了多次捕捉瞬间,我们手动为对象s创建运动。在高ISO模式下捕获每一时刻的噪声帧,并通过对多个噪声帧进行平均得到相应的干净帧。 2、有效的原始视频去噪网络(RViDeNet),通过探

JVM、JRE和 JDK:理解Java开发的三大核心组件

Java是一门跨平台的编程语言,它的成功离不开背后强大的运行环境与开发工具的支持。在Java的生态中,JVM(Java虚拟机)、JRE(Java运行时环境)和JDK(Java开发工具包)是三个至关重要的核心组件。本文将探讨JVM、JDK和JRE的区别,帮助你更好地理解Java的运行机制。 1. JVM:Java虚拟机(Java Virtual Machine) 什么是JVM? JVM,即

eclipse中,更新JDK之后,启动Tomcat报错:

更新到这个版本之后,启动Tomcat报错: 四月 25, 2016 10:13:20 上午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent INFO: The APR based Apache Tomcat Native library which allows optimal performance in prod

JdK版本介绍

JDK(Java Development Kit)是Java开发的核心工具包,它包含了Java运行时环境(JRE)以及Java开发工具(如编译器、调试器等)。JDK的版本更新不断,每个版本都带来了新特性、性能改进和安全性增强。     JDK的版本号遵循一定的命名规则,从JDK 1.0开始,逐渐发展到现在的JDK 17(截至我最后更新的知识,Java社区已经发布了更高版本的预览或早期访问版本

Java JDK 开发环境的配置

安装JDK,安装过程中可以自定义安装目录等信息,将jdk和jre安装在同一个目录下。(这是我遇到的问题:当jdk和jre不在同一个目录下时出现java可以找到目录,而javac提示不是内部命令。)         安装完成后,右击“我的电脑”,点击“属性”;         选择“高级系统属性”,点击“环境变量”;         在“系统变量”中,设置3项