首页 > 其他分享 >IDEA调试的时候怎么确认一个代理对象是cglib动态代理实现的还是jdk动态代理实现的

IDEA调试的时候怎么确认一个代理对象是cglib动态代理实现的还是jdk动态代理实现的

时间:2024-09-26 11:47:03浏览次数:8  
标签:jdk 对象 代理 Proxy CGLIB 动态 断点

在调试过程中,判断一个代理对象是通过 CGLIB 实现的还是通过 JDK 动态代理实现的,可以从以下几个方面入手:

### 1. 检查代理对象的实际类型
在 IntelliJ IDEA 中,你可以使用调试工具查看对象的实际类型。JDK 动态代理和 CGLIB 动态代理在对象类型上有显著区别:

- **JDK 动态代理**:代理对象的类型是一个由 `java.lang.reflect.Proxy` 类生成的动态代理类,它的类名通常是以 `$Proxy` 开头的。
- **CGLIB 动态代理**:代理对象的类型是由 CGLIB 库生成的动态代理类,它的类名通常包含 `EnhancerByCGLIB` 或类似的字符串。

在调试模式下,你可以将鼠标悬停在代理对象上,或者在“Variables”窗口中查看对象的实际类型。

### 2. 使用条件断点或表达式求值
你可以设置条件断点或使用表达式求值功能来检查代理对象的类型。

#### 使用条件断点
1. 在代理对象方法被调用的地方设置一个断点。
2. 右键点击断点,选择“More”。
3. 在“Condition”字段中输入以下条件断点表达式:
```java
proxy.getClass().getName().contains("Proxy") || proxy.getClass().getName().contains("CGLIB")
```
然后在调试模式下,当程序运行到这个断点时,这个表达式会被求值,你可以查看结果。

#### 使用表达式求值
1. 在调试模式下,当程序运行到断点时,打开“Evaluate Expression”窗口(快捷键:`Alt + F8`)。
2. 输入以下表达式来检查代理对象的类型:
```java
proxy.getClass().getName()
```
或者更具体地:
```java
proxy.getClass().getName().contains("Proxy") ? "JDK Proxy" : (proxy.getClass().getName().contains("CGLIB") ? "CGLIB Proxy" : "Unknown Proxy")
```
然后点击“Evaluate”查看结果。

### 3. 查看代理类的继承结构
你可以查看代理类的继承结构来判断其类型:

- **JDK 动态代理**:代理类会直接继承自 `java.lang.reflect.Proxy`。
- **CGLIB 动态代理**:代理类通常会继承自目标类本身,并且会在类名中包含 `EnhancerByCGLIB`。

在调试模式下,你可以通过查看代理对象的类的继承结构来进一步确认其类型。

### 4. 使用自定义的标识方法
如果你有控制权,可以在创建代理对象时添加一些标识信息。例如,在创建 CGLIB 代理时,可以在代理对象中添加一个自定义方法来标识它是 CGLIB 代理。在调试时,你可以调用这个方法来确认代理类型。

通过以上方法,你可以在调试过程中确定一个代理对象是通过 CGLIB 实现的还是通过 JDK 动态代理实现的。

标签:jdk,对象,代理,Proxy,CGLIB,动态,断点
From: https://www.cnblogs.com/zqlmianshi/p/18433143

相关文章

  • 一文理清环境变量的使用与代理的管理
    早在2020年就想写一篇类似的总结,但一直想的到没做到这两天又遇到了此类问题,索性直接来一篇项目里有env、env.devlopmentenv.prodction等等文件,此类.env开头的文件统称为开发环境配置文件,目的是什么?目的是为了基于启动时所选择的环境来配置不同的地址或者数据(是的就是你心中所......
  • 【GEE-PIE遥感】夜间灯光指数提取、长时间尺度植被覆盖度反演、水域动态监测、农作物
    随着航空、航天、近地空间等多个遥感平台的不断发展,近年来遥感技术突飞猛进。由此,遥感数据的空间、时间、光谱分辨率不断提高,数据量也大幅增长,使其越来越具有大数据特征。对于相关研究而言,遥感大数据的出现为其提供了前所未有的机遇,但同时也提出了巨大的挑战。传统的工作站和服......
  • 使用dockerfile来构建一个包含Jdk17的centos7镜像
    文章目录1、dockerfile简介2、入门案例2.1、创建目录/opt/dockerfilejdk172.2、上传jdk-17_linux-x64_bin.tar.gz到/opt/dockerfilejdk172.3、在/opt/dockerfilejdk17目录下创建dockerfile文件2.4、执行命令构建镜像:不要忘了后面的那个.2.5、查看镜像是否建立完成2......
  • 【C语言】链接动态链接库时提示符号在链接时未能找到的一个解决
    在你描述的场景中,出现undefinedreferenceto'process'和undefinedreferenceto'total_received'的错误是因为这些符号在链接时未能找到。这通常是由于某些文件未被正确添加到构建过程中,或者这些符号的定义和声明不匹配导致的。你提到interface.o和file.o被链接生......
  • 伪类选择器:动态伪类、结构伪类、否定伪类、UI伪类、目标伪类、语言伪类
    什么是伪类:很像类,但不是类,是元素特殊状态的一种描述。作用:选中特殊状态的元素1.动态伪类什么是动态伪类:因为它的变化是动态的,拿a:hover举例,一会悬浮一会不悬浮,是动态变化的。拿a标签举例:a:link 代表没有访问过的超链接      a:visited 代表访问过的超链接......
  • Nginx 反向代理 apache kafka UI
    背景我将apachekafkaUI部署到Linux服务器上了,然后我不能直接链接到服务器IP和端口。需要nginx做代理。我这里假设apachekafkaUI已经能够正常连接kafka了。步骤在apachekafkaUI所在的服务器上面设置环境变量[root@kafka1apachekafkaUI]#exportSERVER_SERVLET_CONT......
  • 关于动态库加载问题
    1,GetProcAddress只能加载与函数名一致的符号,如果是C++符号是无法加载函数的所以在进行动态库加载时候,如果被加载的库是C++组件,需要将接口声明添加extern“C”或者增加def文件;否则会出现GetProcAddress加载动态函数时候失败;2,查看动态库是否有符号可以使用depend工具:http://w......
  • JDK的下载和环境变量的配置
    JDK(JavaDevelopmentKit)是Java开发工具包,是开发和编译Java应用程序所需的软件包。JDK由Java编译器、Java运行时环境(JRE)和Java开发工具组成。JDK提供了开发Java应用程序所需的工具和资源,包括Java编译器(javac)、Java虚拟机(JVM)、调试器(jdb)、应用程序打包工具(jar)等。它还包含了Jav......
  • Android 设备命令行开代理
    #!/bin/bashecho"\n----------------Support------------------"echo"设置默认代理proxyset"echo"设置自定义代理proxyset****:9090"echo"删除代理proxyclean"echo"------------------------------------------......
  • vue项目中——如何用echarts实现动态水球图
            有时候UI的脑洞真的很大,总是设计出一些稀奇古怪的图形,但又不得不佩服他们的审美,确实还挺好看的。今天给大家介绍echarts如何实现动态水球图。如图所示:  实现步骤一、引入在vue页面中引入echarts,如未安装需要先npm安装html:<template><divid="chart">......