我最近反编译了一些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();
}
};有人能解释一下这段代码是如何工作的吗?
发布于 2011-07-19 23:07:17
这是non static initialization block。反编译器转换非编译源代码中的字节码是很常见的。最好的代码是由JD Decompiler生成的。此变量
final InputStream val$inputSocketInputStream;
final OutputStream val$outputSocketOutputStream;
final HTTPProxyServerWorker this$0;是对从非静态内部类访问最终局部变量的解释。变量this$0是指包含内部类实例的外部类实例。在这种情况下,内部类是匿名的,所以有初始化块而不是构造函数。我们可以说,使用$的变量是由编译器生成的。实际上,这是反编译器对字节码的解释。
发布于 2011-07-19 23:13:16
{
this$0 = HTTPProxyServerWorker.this;
inputSocketInputStream = inputstream;
outputSocketOutputStream = outputstream;
super();
}此块初始化内部类的隐式变量。
假设您声明了一个具有(非静态)内部类的类:
public class Outter {
private int a = 1;
class Inner {
void doSomethingToOutter() {
a += 1;
}
}
}Inner类将隐式获取额外的成员,这些成员将在构造Outter时被初始化为this。试着反编译这个样本,看看你能得到什么。
https://stackoverflow.com/questions/6749374
复制相似问题