无法重新编译反编译的类文件

时间:2011-11-21 04:42:10

标签: java decompiling recompile

我有一点想要编辑的Java(它是一个Minecraft mod)我反编译了.class文件(用jd-gui),编辑了我想要的东西,然后尝试重新编译(用javac)。

我收到了数百个错误。我只编辑了几行,所以我尝试编译未经编辑的.java,就像它们来自反编译器一样。同样的事情,数百个错误。

对Java知之甚少,所以我确信我犯了一些错误。为什么不能编译尚未从有效的.class文件编辑的代码?

以下是我得到的一个示例:

ReiMinimap.java:451: illegal start of expression
              switch (???)
              ^
ReiMinimap.java:451: ';' expected
              switch (???)
                    ^
ReiMinimap.java:451: illegal start of expression
              switch (???)
                      ^
ReiMinimap.java:451: illegal start of expression
              switch (???)
                        ^
ReiMinimap.java:451: illegal start of expression
              switch (???)
                         ^
ReiMinimap.java:452: illegal start of expression
              {
              ^
ReiMinimap.java:452: : expected
              {
               ^
ReiMinimap.java:453: ';' expected
              case 49:
                     ^
ReiMinimap.java:453: ')' expected
              case 49:
                      ^
ReiMinimap.java:454: illegal start of expression
                this.allowCavemap = true;
                    ^
ReiMinimap.java:454: ';' expected
                this.allowCavemap = true;
                     ^
ReiMinimap.java:454: illegal start of expression
                this.allowCavemap = true;
                                  ^
ReiMinimap.java:454: ';' expected
                this.allowCavemap = true;
                                   ^
ReiMinimap.java:456: orphaned case
              case 50:
              ^
ReiMinimap.java:308: 'try' without 'catch' or 'finally'
    try { if (paramMinecraft == null);
    ^
ReiMinimap.java:499: illegal start of type
      else
      ^
ReiMinimap.java:499: ';' expected
      else
          ^
ReiMinimap.java:501: illegal start of type
        this.chatWelcomed = true;
        ^
ReiMinimap.java:501: <identifier> expected
        this.chatWelcomed = true;
            ^
ReiMinimap.java:501: ';' expected
        this.chatWelcomed = true;
             ^
ReiMinimap.java:501: illegal start of type
        this.chatWelcomed = true;
                          ^
ReiMinimap.java:501: <identifier> expected
        this.chatWelcomed = true;
                           ^

以及一些代码:

if ((!this.chatWelcomed) && (System.currentTimeMillis() < this.chatTime + 10000L))
      {
        Object localObject1;
        for (localObject2 = this.chatLineList.iterator(); ((Iterator)localObject2).hasNext(); ) { localObject1 = (ahe)((Iterator)localObject2).next();

          if ((localObject1 == null) || (this.chatLineLast == localObject1)) break;
          Matcher localMatcher1 = Pattern.compile("§0§0((?:§[1-9a-d])+)§e§f").matcher(((ahe)localObject1).a);
          while (localMatcher1.find())
          {
            this.chatWelcomed = true;
            for (??? : localMatcher1.group(1).toCharArray())
            {
              switch (???)
              {
              case 49:
                this.allowCavemap = true;
                break;
              case 50:
                this.allowEntityPlayer = true;
                break;
              case 51:
                this.allowEntityAnimal = true;
                break;
              case 52:
                this.allowEntityMob = true;
                break;
              case 53:
                this.allowEntitySlime = true;
                break;
              case 54:
                this.allowEntitySquid = true;
                break;
              case 55:
                this.allowEntityLiving = true;
              }
            }
          }

1 个答案:

答案 0 :(得分:2)

听起来原始的Java编译被混淆了。混淆器使用许多技巧来使反向工程代码变得困难。例如,在.class文件中包含方法和字段名称是合法的,这些文件是Java源代码中的保留字(forif等)。如果混淆器使用这样的技巧,那么当你反编译时在.class文件中,Java源代码是非法的,因为您不能将这些保留字用作方法或字段名称。