由Java源代码编译出的所有字节码是否都可以反编译回Java源代码?

8
我看到一些Java反编译器可以将字节码反编译成易读的Java源代码,我想知道Java生成的所有字节码(而不是其他JVM语言)是否都可以再次反编译回Java源代码?
更新 抱歉,让我更清楚地说明问题。
只谈JVM上的普通Java代码(没有Android,没有字节码增强,没有AOP,没有混淆),我希望能够反编译字节码。但我不知道是否有形式的Java代码编译成字节码,将永远无法反编译为易读的Java源代码。

大多数Java代码都是用本地语言编写的...所以你可能会看到方法声明但看不到其主体...此外,例如Android会混淆源代码...即使你反编译也很难阅读。 - chuthan20
1
理论上,任何未混淆的类都可以被相当好地反编译。但实际上,所有现有的反编译器都无法处理特别奇怪和复杂的类。许多反编译器也不能很好地处理窄基本类型的类型转换。 - Antimony
4个回答

7
我想知道所有来自Java(而不是其他JVM语言)的字节码是否都可以反编译为Java源代码?
答案是否定的。
并非所有的Java字节码都能被反编译器成功处理:
- 一个好的混淆器会故意重排字节码,以至于常见的反编译器不会生成可读的源代码...也可能不会生成有效的源代码。 - 许多反编译器无法处理较新的Java构造。 - 许多反编译器无法处理从“复杂”的源代码编译的字节码。 - 即使它们生成可编译的代码,也不能保证代码是正确的。
归根结底,反编译器的质量取决于其作者的智力和勤奋程度。我从未听说过完美的反编译器。

4

Java字节码可以反编译回Java源代码。反编译后的源代码通常不会完全一样,但具有相同的功能。如果您担心有人可能对您的源代码进行反编译,您可以使用混淆器(例如ProGuard)来帮助。


ProGuard并非一种很好的混淆器,但它总比什么都没有要好,而且最重要的是免费。但据我所知,ProGuard不进行任何流程混淆。它只是重命名所有内容并剥离属性,这使得反编译的源代码更难理解,但实际上并不能阻止反编译器。 - Antimony

0

0

我曾有机会反编译多个Java代码,并且总是能够利用现有的工具来思考,字节码是由编译器生成的,这个过程只需要反转即可获得原始代码。我知道一种避免这种情况的方法。

我使用了这个工具。

java.decompiler.free.fr


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接