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

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

Java 文件

public RequestInterceptor requestInterceptor() {
    return template -> {
        // 从父线程中获取 request,避免子线程开启时候丢失了父 request
        if (Objects.isNull(RequestContextHolder.getRequestAttributes()) || RequestContextHolder.getRequestAttributes() instanceof NonWebRequestAttributes) {
            RequestContextHolder.setRequestAttributes(nonWebRequestAttributes, Boolean.TRUE);
            HttpServletRequest request = 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);
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
            if (null != attributes) {
                HttpServletRequest request = attributes.getRequest();
                Enumeration<String> headerNames = request.getHeaderNames();
                if (headerNames != null) {
                    while (headerNames.hasMoreElements()) {
                        String name = headerNames.nextElement();
                        String value = request.getHeader(name);
                        // 一定要去掉 content-length 否则跟自己feign调用时传参字符数会对不上而报错
                        if (name.equalsIgnoreCase("x-tenant-id")) {
                            template.header(name, value);
                        }
                    }
                }
            }
        }
    };
}

 

Class 文件

public RequestInterceptor requestInterceptor() {
    return (template) -> {
        if (!Objects.isNull(RequestContextHolder.getRequestAttributes()) && !(RequestContextHolder.getRequestAttributes() instanceof NonWebRequestAttributes)) {
            RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
            ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
            if (null != attributes) {
                HttpServletRequest requestx = attributes.getRequest();
                Enumeration<String> headerNames = requestx.getHeaderNames();
                if (headerNames != null) {
                    while(headerNames.hasMoreElements()) {
                        String name = (String)headerNames.nextElement();
                        String value = requestx.getHeader(name);
                        if (name.equalsIgnoreCase("x-tenant-id")) {
                            template.header(name, new String[]{value});
                        }
                    }
                }
            }
        } else {
            RequestContextHolder.setRequestAttributes(this.nonWebRequestAttributes, Boolean.TRUE);
            HttpServletRequest request = this.getHttpServletRequestSafely();
            if (null != request && null != request.getAttribute("X-Request-No")) {
                template.header("X-Request-No", new String[]{request.getAttribute("X-Request-No").toString()});
            }

            RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
            template.header("x-tenant-id", new String[]{this.nonWebRequestAttributes.getTenantId()});
        }

    };
}

 

发现问题

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

 

解决方案

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆氪和他的那些代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值