我已经使用jad多年了,其中大多数都与Jadclipse插件配合使用,这使其非常有用。特别是使用“对齐代码进行调试”,它使您可以查看堆栈跟踪中任何行的反编译代码。非常好。
不幸的是,我越来越多地看到注释潜入,这很可能是因为jad期望classfile的顺序正确,而Java 6运行时库显然不是这种情况。因此,在写入文件时,一条指令说“这是第100行”,那么将写入99条空行,如果下一条指令说“这是第10行”,那么jad无法倒带将该输出放在那里,而只是打印指出这是错误的地方。
这是HttpURLConnection的示例:
protected HttpURLConnection(URL url, Proxy proxy, Handler handler1)
{
/* <-MISALIGNED-> */ /* 603*/ super(url);
/* <-MISALIGNED-> */ /* 192*/ ps = null;
/* <-MISALIGNED-> */ /* 196*/ errorStream = null;
/* <-MISALIGNED-> */ /* 199*/ setUserCookies = true;
/* <-MISALIGNED-> */ /* 200*/ userCookies = null;
/* <-MISALIGNED-> */ /* 220*/ currentProxyCredentials = null;
/* <-MISALIGNED-> */ /* 221*/ currentServerCredentials = null;
/* <-MISALIGNED-> */ /* 222*/ needToCheck = true;
/* <-MISALIGNED-> */ /* 223*/ doingNTLM2ndStage = false;
/* <-MISALIGNED-> */ /* 224*/ doingNTLMp2ndStage = false;
/* <-MISALIGNED-> */ /* 226*/ tryTransparentNTLMServer = NTLMAuthentication.supportsTransparentAuth();
/* <-MISALIGNED-> */ /* 227*/ tryTransparentNTLMProxy = NTLMAuthentication.supportsTransparentAuth();
/
现在的问题是,是否还有另一个反编译器可以按行生成更准确的输出。实际的反编译不需要很大,也不需要任何东西,但是我真的很喜欢Java Stack Trace视图期望的反编译。如果与Jadclipse一起使用效果很好,那就更好了。
最佳答案
调试格式的问题来自jadclipse
,而不是jad
。 jad
没有该功能。jadclipse
插件在名为DebugAlignWriter
的类中有一个小代码部分,它可以执行以下操作:
if((align = getAlignTarget(aLine)) != -1)
{
if(align < curLine)
{
if(curLine != 0)
{
out.write(10);
}
out.write("/* <-MISALIGNED-> */ ");
out.write(aLine);
curLine++;
}
else if(align == curLine)
{
out.write(aLine);
}
else
{
for(; align > curLine; curLine++)
{
out.write(10);
}
out.write(aLine);
}
}
基本上,它尝试对齐
jad
的输出。因此,根本原因是
jad
产生的输出不一定按读取顺序排列。不幸的是,我无法阐明jad
为什么如此行事。根据jad
帮助,无法控制顺序。我在
jadclipse
中注意到,如果您设置,则JadClipse-> Formatting->不要在打开大括号之前插入换行符-由于它的工作原理,它会减少的/* <-MISALIGNED-> */
段数。另外,如果您在方法选项之前选中输出字段,则它可能会增加
/* <-MISALIGNED-> */
段的数量,因此请避免使用它。