IntelliJ IDEA - 如何找到 Class 文件的 Java 源码文件进行 Debug?

简介: IntelliJ IDEA - 如何找到 Class 文件的 Java 源码文件进行 Debug?


最近公司一个项目(T)需要整合另外 2 个项目(A、B)的集成,于是,我们的方案是打包A、B成 jar,然后 deploy 到中央仓库,再用 T 去拉 maven pom,但是发现一个问题,debug T 项目的时候里面都是 class 文件(正常),大家都知道,调试 class 文件反编译的结果和原生 java 代码可能是有出入的,举个例子……


Java 文件

publicRequestInterceptorrequestInterceptor() {
returntemplate-> {
// 从父线程中获取 request,避免子线程开启时候丢失了父 requestif (Objects.isNull(RequestContextHolder.getRequestAttributes()) ||RequestContextHolder.getRequestAttributes() instanceofNonWebRequestAttributes) {
RequestContextHolder.setRequestAttributes(nonWebRequestAttributes, Boolean.TRUE);
HttpServletRequestrequest=this.getHttpServletRequestSafely();
if (null!=request&&null!=request.getAttribute("X-Request-No")) {
template.header("X-Request-No", request.getAttribute("X-Request-No").toString());
            }
RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
template.header("x-tenant-id", nonWebRequestAttributes.getTenantId());
        } else {
RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
ServletRequestAttributesattributes= (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
if (null!=attributes) {
HttpServletRequestrequest=attributes.getRequest();
Enumeration<String>headerNames=request.getHeaderNames();
if (headerNames!=null) {
while (headerNames.hasMoreElements()) {
Stringname=headerNames.nextElement();
Stringvalue=request.getHeader(name);
// 一定要去掉 content-length 否则跟自己feign调用时传参字符数会对不上而报错if (name.equalsIgnoreCase("x-tenant-id")) {
template.header(name, value);
                        }
                    }
                }
            }
        }
    };
}

Class 文件

publicRequestInterceptorrequestInterceptor() {
return (template) -> {
if (!Objects.isNull(RequestContextHolder.getRequestAttributes()) &&!(RequestContextHolder.getRequestAttributes() instanceofNonWebRequestAttributes)) {
RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
ServletRequestAttributesattributes= (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
if (null!=attributes) {
HttpServletRequestrequestx=attributes.getRequest();
Enumeration<String>headerNames=requestx.getHeaderNames();
if (headerNames!=null) {
while(headerNames.hasMoreElements()) {
Stringname= (String)headerNames.nextElement();
Stringvalue=requestx.getHeader(name);
if (name.equalsIgnoreCase("x-tenant-id")) {
template.header(name, newString[]{value});
                        }
                    }
                }
            }
        } else {
RequestContextHolder.setRequestAttributes(this.nonWebRequestAttributes, Boolean.TRUE);
HttpServletRequestrequest=this.getHttpServletRequestSafely();
if (null!=request&&null!=request.getAttribute("X-Request-No")) {
template.header("X-Request-No", newString[]{request.getAttribute("X-Request-No").toString()});
            }
RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
template.header("x-tenant-id", newString[]{this.nonWebRequestAttributes.getTenantId()});
        }
    };
}


发现问题

  • 发现了吗,在第一个 if 语句里是不一样的,这也还好,关键是有时候 debug 逻辑是错乱的,比如我遇到过一次调试这个 class 文件,从 else 的逻辑走完,居然跑到了第一个 if 语句里面的第三行逻辑,简直一脸懵的状态~但是当时 deploy 上去也没所谓的 java 源码,那怎么办呢?


解决方案

其实发现可以手动的去关联 java 代码,当然这个需要自己保证代码是一致性的,如图所示

image.png

点击箭头的地方,弹出一个窗口,进行代码关联,当然这里有一个小技巧,不需要精准定位到具体哪个 java 文件,只要选择在其范围的包,IDEA会自动搜索该对应的文件,还是很方便的噢~

image.png

提示找到该文件,点击 OK 即可!image.png

看,大功告成,已经是 java 文件,当然右上角还有一个 Show diff 的功能,可以对比不同地方,当然如果 java 文件和 class 文件因为上文提到过本身代码就是不同,所以肯定会有差异,目前还没那么智能到反编译与原生 java 代码的转换差异,所以这个还是需要自己手动比较下,是否 2 个文件匹配!

目录
相关文章
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
84 9
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
6天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
54 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
27天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
86 34
|
2月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
45 3
|
2月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
2月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
132 2
|
2月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
71 4
|
2月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
90 4
|
2月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
56 5