[英]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.