JAD反编译文件是否100%准确。我正在反编译一些jar文件以获取源代码,当我尝试使用这些java文件构建项目时,它没有显示准确的构建。我做错了还是反编译的文件与原始文件不完全相同。
答案 0 :(得分:3)
简短回答:99%的时间,反编译代码看起来不像原始代码,但它的行为方式应该相同。因此,假设反编译器没有出现任何错误,它应该在功能上是准确的,但不是在实现中。
答案很长:当Java编译器将源代码转换为字节代码时,它会执行某些操作来更改代码的外观。我不是Java编译器细节方面的专家,但是许多编译器执行的简单优化是将小方法插入到调用它们的代码中的位置。
例如,假设我们编译此代码:
public class c
{
public int add(int a, int b)
{
return a + b;
}
public static void main(String [] args)
{
int i = add(1, 2);
}
}
由于b只有一行,并且可以安全地用它的内容替换,因此智能编译器可以将主方法改为:
public static void main(String [] args)
{
int a = 1, b = 2
int i = a + b;
}
或者这个:
public static void main(String [] args)
{
int i = 1 + 2;
}
这样做是因为调用方法的开销比将方法内容直接放到它所调用的地方的开销要差。
我不知道Java编译器在这种情况下会做什么,但它会像这样对代码进行更改。它不一定是不准确的,因为它确实与原始代码做同样的事情。由于编译器不会在.class文件中的任何位置保留这些更改的详细信息,因此反编译器无法知道是否在代码中的任何给定点执行了优化,如果它是以这种方式编写的
还有许多其他事情可能无法在转换为字节代码(例如变量名和注释)后继续存在。
所以是的,当您查看反编译代码时,您正在查看.class文件的外观,而不是.java文件的外观。即使它看起来不准确,它应该运行相同。
答案 1 :(得分:-2)
如果该程序中有更多私有类。反编译器将以自己的方式转换代码,但如果少于那么它将显示正确的代码..如果是xml文件,那么它将完全转换....