反编译工具深坑(jd-gui-0.35)

简介: 今天遇到一个问题,jd-gui-0.3.5 反编译jar包出现如下问题:// ERROR // public void checkAndLogin() { // Byte code: // 0: iconst_0 // 1...

今天遇到一个问题,jd-gui-0.3.5 反编译jar包出现如下问题:

// ERROR //
  public void checkAndLogin() { // Byte code:
    //   0: iconst_0
    //   1: istore_1
    //   2: iload_1
    //   3: ifne +208 -> 211
    //   6: ldc2_w 15
    //   9: invokestatic 17 java/lang/Thread:sleep  (J)V
    //   12: aload_0
    //   13: getfield 18    com/erayt/fx/price/service/impl/FxPriceOperateServiceImpl:requestPriceDao   Lcom/erayt/quotation/dao/RequestPriceDao;
    //   16: ldc 19
    //   18: invokeinterface 20 2 0
    //   23: astore_2
    //   24: getstatic 9    com/erayt/fx/price/service/impl/FxPriceOperateServiceImpl:LOGGER    Lcom/erayt/solar/logging/Log;
    //   27: ldc 21
    //   29: iconst_2
    //   30: anewarray 11   java/lang/Object
    //   33: dup
    //   34: iconst_0
    //   35: aload_2
    //   36: aastore
    //   37: dup
    //   38: iconst_1
    //   39: aload_0
    //   40: getfield 22    com/erayt/fx/price/service/impl/FxPriceOperateServiceImpl:appName   Ljava/lang/String;
    //   43: aastore
    //   44: invokevirtual 12   com/erayt/solar/logging/Log:info    (Ljava/lang/String;[Ljava/lang/Object;)V
    //   47: aload_0
    //   48: getfield 23    com/erayt/fx/price/service/impl/FxPriceOperateServiceImpl:uniqueName    Ljava/lang/String;
    //   51: aload_2
    //   52: ldc 24
    //   54: invokevirtual 25   java/lang/String:split  (Ljava/lang/String;)[Ljava/lang/String;
    //   57: iconst_0
    //   58: aaload
    //   59: invokevirtual 26   java/lang/String:equals (Ljava/lang/Object;)Z
    //   62: ifeq +7 -> 69
    //   65: aload_0
    //   66: invokevirtual 27   com/erayt/fx/price/service/impl/FxPriceOperateServiceImpl:login ()V
    //   69: ldc2_w 28
    //   72: invokestatic 17    java/lang/Thread:sleep  (J)V
    //   75: goto +136 -> 211
    //   78: astore_3
    //   79: getstatic 9    com/erayt/fx/price/service/impl/FxPriceOperateServiceImpl:LOGGER    Lcom/erayt/solar/logging/Log;
    //   82: ldc 31
    //   84: iconst_2
    //   85: anewarray 11   java/lang/Object
    //   88: dup
    //   89: iconst_0
    //   90: aload_3
    //   91: invokevirtual 32   java/lang/InterruptedException:getMessage   ()Ljava/lang/String;
    //   94: aastore
    //   95: dup
    //   96: iconst_1
    //   97: aload_3
    //   98: aastore
    //   99: invokevirtual 33   com/erayt/solar/logging/Log:error   (Ljava/lang/String;[Ljava/lang/Object;)V
    //   102: goto +109 -> 211
    //   105: astore_2
    //   106: getstatic 9   com/erayt/fx/price/service/impl/FxPriceOperateServiceImpl:LOGGER    Lcom/erayt/solar/logging/Log;
    //   109: ldc 35
    //   111: iconst_2
    //   112: anewarray 11  java/lang/Object
    //   115: dup
    //   116: iconst_0
    //   117: aload_2
    //   118: aastore
    //   119: dup
    //   120: iconst_1
    //   121: aload_2
    //   122: invokevirtual 36  java/lang/Exception:getMessage  ()Ljava/lang/String;
    //   125: aastore
    //   126: invokevirtual 33  com/erayt/solar/logging/Log:error   (Ljava/lang/String;[Ljava/lang/Object;)V
    //   129: iconst_0
    //   130: istore_1
    //   131: ldc2_w 28
    //   134: invokestatic 17   java/lang/Thread:sleep  (J)V
    //   137: goto +71 -> 208
    //   140: astore_2
    //   141: getstatic 9   com/erayt/fx/price/service/impl/FxPriceOperateServiceImpl:LOGGER    Lcom/erayt/solar/logging/Log;
    //   144: ldc 31
    //   146: iconst_2
    //   147: anewarray 11  java/lang/Object
    //   150: dup
    //   151: iconst_0
    //   152: aload_2
    //   153: invokevirtual 32  java/lang/InterruptedException:getMessage   ()Ljava/lang/String;
    //   156: aastore
    //   157: dup
    //   158: iconst_1
    //   159: aload_2
    //   160: aastore
    //   161: invokevirtual 33  com/erayt/solar/logging/Log:error   (Ljava/lang/String;[Ljava/lang/Object;)V
    //   164: goto +44 -> 208
    //   167: astore 4
    //   169: ldc2_w 28
    //   172: invokestatic 17   java/lang/Thread:sleep  (J)V
    //   175: goto +30 -> 205
    //   178: astore 5
    //   180: getstatic 9   com/erayt/fx/price/service/impl/FxPriceOperateServiceImpl:LOGGER    Lcom/erayt/solar/logging/Log;
    //   183: ldc 31
    //   185: iconst_2
    //   186: anewarray 11  java/lang/Object
    //   189: dup
    //   190: iconst_0
    //   191: aload 5
    //   193: invokevirtual 32  java/lang/InterruptedException:getMessage   ()Ljava/lang/String;
    //   196: aastore
    //   197: dup
    //   198: iconst_1
    //   199: aload 5
    //   201: aastore
    //   202: invokevirtual 33  com/erayt/solar/logging/Log:error   (Ljava/lang/String;[Ljava/lang/Object;)V
    //   205: aload 4
    //   207: athrow
    //   208: goto -206 -> 2
    //   211: return
    //
    // Exception table:
    //   from   to  target  type
    //   69 75  78  java/lang/InterruptedException
    //   6  69  105 java/lang/Exception
    //   131    137 140 java/lang/InterruptedException
    //   6  69  167 finally
    //   105    131 167 finally
    //   167    169 167 finally
    //   169    175 178 java/lang/InterruptedException } 

代码如下:

    @Override
    public void checkAndLogin(){
        boolean runOk=false;
        while(!runOk){
        try {
        Thread.sleep(2000);
        String value=requestPriceDao.getMarginPriceLockByName(Constant.LOCK_NAME_PRICELOCK); 
        LOGGER.info("持有锁value【{}】,本机【{}】", value,appName);
        if(uniqueName.equals(value.split(MarginConstants.SEMICOLON_SPLITER)[0])){
                login();
        }
          break;
        } catch (Exception e) {
            LOGGER.error("数据库报错等待20s后重新加锁【{}】【{}】",e,e.getMessage());
            runOk=false;
        }finally{
            try {
                Thread.sleep(1000*20);
            } catch (InterruptedException e) {
                LOGGER.error("[ERR]线程等待错误:[{}]", e.getMessage(),e);
            }
        }
        }
    }

代码本身没有看出问题,有需要优化的地方,但是怎么看都不会有编译出错的地方,在排查这个问题的时候,方向一直是查为什么会反编译不出来。
后来网上看到一个帖子,说反编译工具的问题,换一个工具试试。
然后去下载了另外一个工具:https://github.com/deathmarine/Luyten

下载步骤:

然后反编译看了一下,正常编译,但是和代码有一些区别

    @Override
    public void checkAndLogin() {
        boolean runOk = false;
        while (!runOk) {
            try {
                Thread.sleep(2000L);
                final String value = this.requestPriceDao.getMarginPriceLockByName("PRICE_LOCK");
                FxPriceOperateServiceImpl.LOGGER.info("\u62a5\u4ef7\u5f15\u64ce\u8fde\u63a5\u6210\u529f\u540e\uff0c\u6301\u6709\u9501value\u3010{}\u3011,\u672c\u673a\u3010{}\u3011", new Object[] { value, this.appName });
                if (this.uniqueName.equals(value.split(";")[0])) {
                    this.login();
                }
            }
            ---这里少了 break; 不是我删除的,真的是没有。
            catch (Exception e) {
                FxPriceOperateServiceImpl.LOGGER.error("\u6570\u636e\u5e93\u62a5\u9519\u7b49\u5f8520s\u540e\u91cd\u65b0\u52a0\u9501\u3010{}\u3011\u3010{}\u3011", new Object[] { e, e.getMessage() });
                runOk = false;
                try {
                    Thread.sleep(20000L);
                }
                catch (InterruptedException e2) {
                    FxPriceOperateServiceImpl.LOGGER.error("[ERR]\u7ebf\u7a0b\u7b49\u5f85\u9519\u8bef:[{}]", new Object[] { e2.getMessage(), e2 });
                }
            }
            finally {
                try {
                    Thread.sleep(20000L);
                }
                catch (InterruptedException e3) {
                    FxPriceOperateServiceImpl.LOGGER.error("[ERR]\u7ebf\u7a0b\u7b49\u5f85\u9519\u8bef:[{}]", new Object[] { e3.getMessage(), e3 });
                }
            }
        }
    }

具体分析,break 并不合适,修改标志位最合适。 break 修改成 runOk=true; 反编译一切正常。

总结:
反编译报错,可能是工具问题,但是不能忽略他,要找到问题的原因。

目录
相关文章
|
7月前
|
设计模式 数据可视化 Java
JD-GUI和JAD对War包和Jar包进行反编译教学
JD-GUI和JAD是两个用于反编译Java字节码的工具。代码调试:当你需要调试Java代码时,可以使用JD-GUI将Java类反编译为可读的源代码,以便进行调试和分析。代码分析:如果你需要对Java类进行深入的分析,例如了解代码结构、方法调用关系等,可以使用JD-GUI来反编译Java类,并查看反编译后的源代码。代码重构:如果你需要修改现有的Java类,可以使用JD-GUI将Java类反编译为可读的源代码,然后进行修改。注意,反编译后的源代码可能不完全与原始源代码相同,因此在进行修改时需要谨慎。
647 1
|
数据安全/隐私保护 iOS开发 开发者
iOS 逆向编程(十八)Reveal 详细安装(以及安装问题解决)(上)
iOS 逆向编程(十八)Reveal 详细安装(以及安装问题解决)
653 0
|
6月前
|
Python Windows
Python基础教程(第3版)中文版 第18章 程序打包 (笔记)
Python基础教程(第3版)中文版 第18章 程序打包 (笔记)
|
2月前
|
C#
Delphi可不可以制作出像c#那样的dll类库?
在Delphi中,创建DLL项目(如dll.dpr)并定义一个类TMyCls后,在另一个项目(如test.dpr)中可以引入此DLL并直接实例化和调用类的方法。然而,Delphi目前主要支持两种DLL形式:动态链接库(需显式声明exports,仅支持函数调用)和ActiveX DLL(需定义IDL接口)。这两种方式都较为繁琐。相比之下,C# 的DLL类库更为便捷,编写并编译后即可在其他项目中直接使用。
|
监控 iOS开发
iOS 逆向编程(十八)Reveal 详细安装(以及安装问题解决)(下)
iOS 逆向编程(十八)Reveal 详细安装(以及安装问题解决)(下)
320 0
|
4月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
7月前
|
开发工具 Python Windows
基于Python开发的飞机大战小游戏彩色版(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)
基于Python开发的飞机大战小游戏彩色版(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)
|
JavaScript 前端开发 Java
【小马迷途】—myeclipse快速开发技巧
小编最近刚接触java的项目,对于我这个小菜鸟来说,快速熟悉开发工具很重要,开始的时候就将自己引入一个正规化的道路中去,就这样慢慢的提升自己的加速度。
|
Python
Tkinter模块GUI界面化编程实战(三)——2048小游戏(含详解及完整源码、完整程序下载链接)
Tkinter模块GUI界面化编程实战(三)——2048小游戏(含详解及完整源码、完整程序下载链接)
208 0
|
Python
python植物大战僵尸二十六之打包游戏为exe可执行文件
python植物大战僵尸二十六之打包游戏为exe可执行文件
228 0