Java декомпилированный код - PullRequest
2 голосов
/ 19 июля 2011

Я недавно декомпилировал немного кода Java, но части в синтаксисе я не понимаю. Я искал это, но многие потоки, которые я вижу, говорят, что код, подобный этому, зависит от компилятора. При проверке синтаксиса Java это возвращает ошибки.

public void run()
    {
        try
        {
            final InputStream inputSocketInputStream = inputSocket.getInputStream();
            final OutputStream inputSocketOutputStream = inputSocket.getOutputStream();
            Socket socket = new Socket();
            socket.connect(new InetSocketAddress(APJP.APJP_LOCAL_HTTP_SERVER_ADDRESS, APJP.APJP_LOCAL_HTTP_SERVER_PORT));
            final InputStream outputSocketInputStream = socket.getInputStream();
            final OutputStream outputSocketOutputStream = socket.getOutputStream();
            Thread thread = new Thread() {

                final InputStream val$inputSocketInputStream;
                final OutputStream val$outputSocketOutputStream;
                final HTTPProxyServerWorker this$0;

                public void run()
                {
                    try
                    {
                        byte abyte0[] = new byte[5120];
                        for(int i = 0; (i = inputSocketInputStream.read(abyte0)) != -1;)
                        {
                            outputSocketOutputStream.write(abyte0, 0, i);
                        }

                        outputSocketOutputStream.close();
                    }
                    catch(Exception exception1) { }
                }


            {
                this$0 = HTTPProxyServerWorker.this;
                inputSocketInputStream = inputstream;
                outputSocketOutputStream = outputstream;
                super();
            }
            };
            thread.start();
            /** OMITTED **/
    }

Я запутался в этом бите:

Thread thread = new Thread() {

                final InputStream val$inputSocketInputStream;
                final OutputStream val$outputSocketOutputStream;
                final HTTPProxyServerWorker this$0;

                public void run()
                {
                    try
                    {
                        byte abyte0[] = new byte[5120];
                        for(int i = 0; (i = inputSocketInputStream.read(abyte0)) != -1;)
                        {
                            outputSocketOutputStream.write(abyte0, 0, i);
                        }

                        outputSocketOutputStream.close();
                    }
                    catch(Exception exception1) { }
                }

            //WHAT IS THIS BELOW? Constructor?
            {
                this$0 = HTTPProxyServerWorker.this; 
                inputSocketInputStream = inputstream;
                outputSocketOutputStream = outputstream;
                super();
            }
            };

Может кто-нибудь объяснить, как этот бит кода должен работать?

Ответы [ 2 ]

4 голосов
/ 19 июля 2011

Это нестатический блок инициализации .Обычно декомпилятор преобразует байт-код в некомпилируемый источник.ИМХО лучший код производится JD Decompiler.Эти переменные

            final InputStream val$inputSocketInputStream;
            final OutputStream val$outputSocketOutputStream;
            final HTTPProxyServerWorker this$0;

являются интерпретацией доступа к конечным локальным переменным из нестатических внутренних классов.Переменная this$0 относится к экземпляру внешнего класса, содержащему экземпляр внутреннего класса.В этом случае внутренний класс является анонимным, поэтому вместо конструктора есть блок инициализации.Можно сказать, что переменные с $ генерируются компилятором.Фактически это интерпретация байт-кода декомпиляторами.

0 голосов
/ 19 июля 2011
{
  this$0 = HTTPProxyServerWorker.this; 
  inputSocketInputStream = inputstream;
  outputSocketOutputStream = outputstream;
  super();
}

Этот блок инициализирует неявные переменные внутреннего класса.

Предположим, вы объявляете класс с (нестатическим) внутренним классом:

public class Outter {
  private int a = 1;

  class Inner {
    void doSomethingToOutter() {
      a += 1;
    }
  }
}

Класс Inner косвенно получит дополнительных членов, которые будут инициализированы до this при построении Outter. Попробуйте декомпилировать этот пример, чтобы увидеть, что вы получите.

...