繁体   English   中英

Java反编译代码含义

[英]Java decompiled code meaning

我最近反编译了一些 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();
            }
            };

谁能解释这段代码应该如何工作?

是非 static 初始化块 反编译器在非编译源中转换字节码是很常见的。 恕我直言,最佳代码由 JD Decompiler 生成。 这个变量

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

是从非静态内部类访问最终局部变量的解释。 变量this$0指的是包含内部 class 实例的外部 class 实例。 在这种情况下,内部 class 是匿名的,因此存在初始化块而不是构造函数。 可以说,带有$的变量是编译器生成的。 事实上,这是反编译器对字节码的解释。

{
  this$0 = HTTPProxyServerWorker.this; 
  inputSocketInputStream = inputstream;
  outputSocketOutputStream = outputstream;
  super();
}

此块初始化内部 class 隐式变量。

假设您声明一个带有(非静态)内部 class 的 class:

public class Outter {
  private int a = 1;

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

Inner class 将隐含地获取其他成员,这些成员将在构造Outter时初始化this 尝试反编译这个示例,看看你得到了什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM