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

Posted Lux_Sun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 个文件匹配!

以上是关于IntelliJ IDEA - 如何找到 Class 文件的 Java 源码文件进行 Debug?的主要内容,如果未能解决你的问题,请参考以下文章

如何卸载intellij idea community edition 2016.2.4

IntelliJ IDEA导入项目如何启动?

intellij如何取消汉化包

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

如何破解intellij idea

如何在IntelliJ IDEA上 添加GIT和Maven,mybatis插件