为什么反编译Java代码如此容易?

为什么反编译Java代码如此容易?,java,decompiling,Java,Decompiling,所以我刚刚意识到反编译Java代码是多么容易。我一直在网上搜索,似乎不明白为什么这么容易。每次我在谷歌上搜索诸如“为什么我可以分解.class文件?”或“为什么Java反编译如此容易”之类的东西时,我得到的只是指向可以轻松地对代码进行反编译的软件的链接。所以我转向StAcExp:为什么java可以被转换回易读的源代码,C++和其他语言对反编译不太友好? 谢谢,因为Java字节码比汇编代码更接近(更相似)源代码 特别是,.class文件包括类名、方法名、字段和参数类型等的元数据。 Java(或.N

所以我刚刚意识到反编译Java代码是多么容易。我一直在网上搜索,似乎不明白为什么这么容易。每次我在谷歌上搜索诸如“为什么我可以分解
.class
文件?”或“为什么Java反编译如此容易”之类的东西时,我得到的只是指向可以轻松地对代码进行反编译的软件的链接。所以我转向StAcExp:为什么java可以被转换回易读的源代码,C++和其他语言对反编译不太友好?
谢谢,因为Java字节码比汇编代码更接近(更相似)源代码

特别是,
.class
文件包括类名、方法名、字段和参数类型等的元数据。
Java(或.Net)反编译器需要做的就是查看每个方法体中的指令,并将它们转换为适当的语法结构


P> >相比之下,像C++这样的本地语言根本不包含任何元数据,所以反编译程序需要重构所有的东西。

< P> java被编译成中间形式JVM字节码,它保留了原始java代码中包含的大量信息。像C++这样的语言编译成汇编代码,看起来与原始代码有很大不同,因此,更难逆转。

因为java从来没有真正C++编译过的“编译”。(至少在JIT开始之前)如果您想让这变得更困难,请使用像ZKM这样的适当的模糊处理。它的控制流混淆将阻止任何反编译器能够反编译您的代码;用户首先必须对代码进行deob(这需要对ZKM和字节码工程有很高的了解)。但是所有的类都不能被反编译,而且所有反编译的类都不能在没有修改的情况下被编译回来。+1。所以关键是字节码,而不是Java。java可以编译成x86指令(,),然后像C++一样难以反编译。@ AlxeliKaigoRodov如果结果代码仍然允许反射工作,它仍然比C++更容易反编译,因为它保持了大量的元数据。@戴夫:方法/类级信息是这样的,方法中的实际指令将比
.class
文件更难反编译。此外,java字节码没有像本机代码那样优化,因为java在执行时依赖抖动来优化代码。