首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java反编译的代码含义

Java反编译的代码含义
EN

Stack Overflow用户
提问于 2011-07-19 23:04:16
回答 2查看 3.2K关注 0票数 2

我最近反编译了一些Java代码,但部分语法我不理解。我已经搜索过了,但是我看到很多线程都说类似的代码是依赖于编译器的。在java语法检查中,这将返回错误。

代码语言:javascript
复制
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 **/
    }

我对这一点感到困惑:

代码语言:javascript
复制
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();
            }
            };

有人能解释一下这段代码是如何工作的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-19 23:07:17

这是non static initialization block。反编译器转换非编译源代码中的字节码是很常见的。最好的代码是由JD Decompiler生成的。此变量

代码语言:javascript
复制
            final InputStream val$inputSocketInputStream;
            final OutputStream val$outputSocketOutputStream;
            final HTTPProxyServerWorker this$0;

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

票数 4
EN

Stack Overflow用户

发布于 2011-07-19 23:13:16

代码语言:javascript
复制
{
  this$0 = HTTPProxyServerWorker.this; 
  inputSocketInputStream = inputstream;
  outputSocketOutputStream = outputstream;
  super();
}

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

假设您声明了一个具有(非静态)内部类的类:

代码语言:javascript
复制
public class Outter {
  private int a = 1;

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

Inner类将隐式获取额外的成员,这些成员将在构造Outter时被初始化为this。试着反编译这个样本,看看你能得到什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6749374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档