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 个文件匹配!

目录
相关文章
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
924 7
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
517 5
|
消息中间件 算法 安全
JUC并发—1.Java集合包底层源码剖析
本文主要对JDK中的集合包源码进行了剖析。
|
存储 Java
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
前言 下面,跟上主播的节奏,马上开始ThreadLocal源码的阅读( ̄▽ ̄)" 内部结构 如下图所示,我们可以知道,每个线程,都有自己的threadLocals字段,指向ThreadLocalMap
755 81
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
818 70
|
12月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
IDE Java 开发工具
【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤
IntelliJ IDEA创建Java项目的图文详细步骤,手把手带你创建Java项目
2302 10
【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤
|
JavaScript Java 关系型数据库
家政系统源码,java版本
这是一款基于SpringBoot后端框架、MySQL数据库及Uniapp移动端开发的家政预约上门服务系统。
490 6
家政系统源码,java版本
|
Java
【源码】【Java并发】【ReentrantLock】适合中学者体质的ReentrantLock源码阅读
因为本文说的是ReentrantLock源码,因此会默认,大家对AQS有基本的了解(比如同步队列、条件队列大概> 长啥样?)。 不懂AQS的小朋友们,你们好呀!也欢迎先看看这篇
340 13
【源码】【Java并发】【ReentrantLock】适合中学者体质的ReentrantLock源码阅读
|
Java 应用服务中间件 Maven
在IntelliJ IDEA中如何配置使用Maven以创建Tomcat环境
所以,别担心这些工具看起来有些吓人,实际上这些都是为了帮助你更好的完成工作的工具,就像超市里的各种烹饪工具一样,尽管它们看起来可能很复杂,但只要你学会用,它们会为你烹饪出一道道美妙的食物。这就是学习新技能的乐趣,让我们一起享受这个过程,攀登知识的高峰!
899 27