Декомпиляция.

Я сделал из .class файла .java файл. Подредактировал. Как теперь его обратно в .class перевести? По обычному
не могу - туча ошибок.

P.S. Классный форум.
 
Код:
package C;

import I.I;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.List;
import net.launcher.components.Checkbox;
import net.launcher.components.Frame;

public class E
{
  public static final String I(String paramString)
  {
    FileInputStream localFileInputStream = null;
    DigestInputStream localDigestInputStream = null;
    BufferedInputStream localBufferedInputStream = null;
    Formatter localFormatter = null;
    try
    {
      MessageDigest localMessageDigest = MessageDigest.getInstance(I.I(1886));
      localFileInputStream = new FileInputStream(paramString);
      localBufferedInputStream = new BufferedInputStream(localFileInputStream);
      localDigestInputStream = new DigestInputStream(localBufferedInputStream, localMessageDigest);
      while (localDigestInputStream.read() != -1);
      localObject1 = localMessageDigest.digest();
      localFormatter = new Formatter();
      for (byte b : localObject1)
        localFormatter.format(I.I(3072), new Object[] { Byte.valueOf(b) });
      String str = localFormatter.toString();
      return str;
    }
    catch (Exception localException1)
    {
      Object localObject1 = "";
      return localObject1;
    }
    finally
    {
      try
      {
        localFileInputStream.close();
      }
      catch (Exception localException10)
      {
      }
      try
      {
        localDigestInputStream.close();
      }
      catch (Exception localException11)
      {
      }
      try
      {
        localBufferedInputStream.close();
      }
      catch (Exception localException12)
      {
      }
      try
      {
        localFormatter.close();
      }
      catch (Exception localException13)
      {
      }
    }
  }

  public static final List Z(String paramString)
  {
    ArrayList localArrayList = new ArrayList();
    String[] arrayOfString = { I.I(1853), I.I(1858) };
    for (int i = 0; i < paramString.split(I.I(2074))[2].split(I.I(3028)).length; i++)
    {
      File localFile1;
      Object localObject1;
      File localFile2;
      if (paramString.split(I.I(2074))[2].split(I.I(3028))[i].equals(I.I(3031)))
      {
        localFile1 = new File(C.C().getAbsolutePath() + File.separator + arrayOfString[i]);
        if ((localFile1.exists()) && (localFile1.isDirectory()))
        {
          localObject1 = localFile1.list(new F());
          if ((localObject1 == null) || (localObject1.length == 0))
            return localArrayList;
          for (String str1 : localObject1)
          {
            localFile2 = new File(localFile1.getAbsolutePath() + File.separator + str1);
            append(localFile2);
          }
        }
      }
      else
      {
        localFile1 = new File(C.C().getAbsolutePath() + File.separator + arrayOfString[i]);
        localObject1 = paramString.split(I.I(2074))[2].split(I.I(3028))[i];
        ??? = paramString.split(I.I(2074))[2].split(I.I(3028))[i].split(I.I(1708));
        if (Frame.main.updatepr.isSelected())
        {
          for (localFile2 : ???)
            localArrayList.add(arrayOfString[i] + I.I(1847) + localFile2.split(I.I(3038))[0]);
          return localArrayList;
        }
        if ((localFile1.exists()) && (localFile1.isDirectory()))
        {
          ??? = localFile1.list(new J());
          File localFile3;
          for (String str2 : ???)
          {
            localFile3 = new File(localFile1.getAbsolutePath() + File.separator + str2);
            String str3 = I(localFile3.getAbsolutePath());
            if (!((String)localObject1).contains(str2 + I.I(3038) + str3 + I.I(1708)))
            {
              append(localFile3);
              localObject1 = ((String)localObject1).replaceAll(str2 + I.I(3038) + str3 + I.I(1708), "");
              ??? = ((String)localObject1).split(I.I(1708));
            }
          }
          ??? = "";
          for (localFile3 : ???)
            ??? = (String)??? + localFile3 + I.I(3038) + I(new StringBuilder().append(localFile1.getAbsolutePath()).append(File.separator).append(localFile3).toString()) + I.I(1708);
          for (localFile3 : ???)
            if (!((String)???).contains(localFile3))
              localArrayList.add(arrayOfString[i] + I.I(1847) + localFile3.split(I.I(3038))[0]);
        }
        else
        {
          for (Object localObject6 : ???)
            localArrayList.add(arrayOfString[i] + I.I(1847) + localObject6.split(I.I(3038))[0]);
        }
      }
    }
    return localArrayList;
  }

  public static final List add(String paramString)
  {
    ArrayList localArrayList = new ArrayList();
    String[] arrayOfString = { I.I(1853), I.I(1858) };
    for (int i = 0; i < paramString.split(I.I(2074))[2].split(I.I(3028)).length; i++)
    {
      File localFile1;
      Object localObject1;
      File localFile2;
      if (paramString.split(I.I(2074))[2].split(I.I(3028))[i].equals(I.I(3031)))
      {
        localFile1 = new File(C.C().getAbsolutePath() + File.separator + arrayOfString[i]);
        if ((localFile1.exists()) && (localFile1.isDirectory()))
        {
          localObject1 = localFile1.list(new S());
          if ((localObject1 == null) || (localObject1.length == 0))
            return localArrayList;
          for (String str1 : localObject1)
          {
            localFile2 = new File(localFile1.getAbsolutePath() + File.separator + str1);
            append(localFile2);
            System.exit(0);
            Runtime.getRuntime().exit(0);
          }
        }
      }
      else
      {
        localFile1 = new File(C.C().getAbsolutePath() + File.separator + arrayOfString[i]);
        localObject1 = paramString.split(I.I(2074))[2].split(I.I(3028))[i];
        ??? = paramString.split(I.I(2074))[2].split(I.I(3028))[i].split(I.I(1708));
        if (Frame.main.updatepr.isSelected())
        {
          for (localFile2 : ???)
            localArrayList.add(arrayOfString[i] + I.I(1847) + localFile2.split(I.I(3038))[0]);
          return localArrayList;
        }
        if ((localFile1.exists()) && (localFile1.isDirectory()))
        {
          ??? = localFile1.list(new A());
          File localFile3;
          for (String str2 : ???)
          {
            localFile3 = new File(localFile1.getAbsolutePath() + File.separator + str2);
            String str3 = I(localFile3.getAbsolutePath());
            if (!((String)localObject1).contains(str2 + I.I(3038) + str3 + I.I(1708)))
            {
              append(localFile3);
              localObject1 = ((String)localObject1).replaceAll(str2 + I.I(3038) + str3 + I.I(1708), "");
              ??? = ((String)localObject1).split(I.I(1708));
              System.exit(0);
              Runtime.getRuntime().exit(0);
            }
          }
          ??? = "";
          for (localFile3 : ???)
            ??? = (String)??? + localFile3 + I.I(3038) + I(new StringBuilder().append(localFile1.getAbsolutePath()).append(File.separator).append(localFile3).toString()) + I.I(1708);
          for (localFile3 : ???)
            if (!((String)???).contains(localFile3))
              localArrayList.add(arrayOfString[i] + I.I(1847) + localFile3.split(I.I(3038))[0]);
        }
        else
        {
          for (Object localObject6 : ???)
            localArrayList.add(arrayOfString[i] + I.I(1847) + localObject6.split(I.I(3038))[0]);
        }
      }
    }
    return localArrayList;
  }

  public static final void I(String paramString, boolean paramBoolean)
  {
    if (!Frame.main.offline.isSelected())
    {
      C.Z(I.I(2936));
      int i = 0;
      String str = C.C() + File.separator + V.b + File.separator;
      if (!D.I(D.C(paramString.split(I.I(2074))[0].split(I.I(1708))[3]), I.I(2096)).equals(I(str + V.l)))
        i = 1;
      if (!D.I(D.C(paramString.split(I.I(2074))[0].split(I.I(1708))[4]), I.I(2096)).equals(I(str + V.f)))
        i = 1;
      if (!D.I(D.C(paramString.split(I.I(2074))[0].split(I.I(1708))[5]), I.I(2096)).equals(I(str + V.e)))
        i = 1;
      if (!D.I(D.C(paramString.split(I.I(2074))[0].split(I.I(1708))[2]), I.I(2096)).equals(I(str + V.m)))
        i = 1;
      if (add(paramString).size() != 0)
        i = 1;
      if ((i != 0) && (paramBoolean))
      {
        Frame.main.setError("Ошибка вторичной проверки кеша.");
        return;
      }
      if ((i != 0) && (!paramBoolean))
      {
        C.Z(I.I(2966));
        System.exit(0);
        return;
      }
      C.Z(I.I(2999));
    }
  }

  public static final void append(File paramFile)
  {
    try
    {
      if (!paramFile.exists())
        return;
      if (paramFile.isDirectory())
      {
        for (File localFile : paramFile.listFiles())
          append(localFile);
        paramFile.delete();
      }
      else
      {
        paramFile.delete();
      }
    }
    catch (Exception localException)
    {
    }
  }
}
Метод append(в самом низу). Из него нужно убрать paramFile.delete(). Но как это сделать в таком байт-коде:
Код:
aload_0
invokevirtual java/io/File/exists()Z
ifne 5
return
aload_0
invokevirtual java/io/File/isDirectory()Z
ifeq 31
aload_0
invokevirtual java/io/File/listFiles()[Ljava/io/File;
astore_1
aload_1
arraylength
istore_2
iconst_0
istore_3
iload_3
iload_2
if_icmpge 27
aload_1
iload_3
aaload
astore 4
aload 4
invokestatic C/E/append(Ljava/io/File;)V
iinc 3 1
goto 16
aload_0
invokevirtual java/io/File/delete()Z
pop
goto 34
aload_0
invokevirtual java/io/File/delete()Z
pop
goto 36
astore_1
return

Я, кстати, смог сделать. С трудом...
 
Я нашел два классных способа.1)Fernflower. Очень точно декомпилирует .class в .java .
2)JD gui - просмотр .class файла. JBE(java bytecode editor) - редактирование .class файла в виде bytecode.
 
Я знаю. Но потом при компиляции могут возникнуть ошибки. А в JBE менять .class не декомпилируя его позволяет избежать ошибок.
 
Сверху