Java 反编译JVM语言

Java 反编译JVM语言,java,jvm,reverse-engineering,decompiling,jvm-languages,Java,Jvm,Reverse Engineering,Decompiling,Jvm Languages,是否可以将Groovy、Scala等JVM语言反编译为其初始形式 如果我尝试反编译一个4行的Groovy类,我会得到大约20行反编译的Java代码 这更多的是一个理论问题,而不是一个实际问题,因为市场上没有这样的反编译器(据我所知) 谢谢。好吧,我唯一能想到的就是编译器优化和注释的问题。注释不会保留在字节码中(谢天谢地),编译器可能会修改源代码以获得更好的性能,除了这似乎是可能的之外。是的,Java反编译器可以管理类似的保真度(意思是:代码看起来相似,但不一定相同) 然而,每种语言都需要一个专用

是否可以将Groovy、Scala等JVM语言反编译为其初始形式

如果我尝试反编译一个4行的Groovy类,我会得到大约20行反编译的Java代码

这更多的是一个理论问题,而不是一个实际问题,因为市场上没有这样的反编译器(据我所知)


谢谢。

好吧,我唯一能想到的就是编译器优化和注释的问题。注释不会保留在字节码中(谢天谢地),编译器可能会修改源代码以获得更好的性能,除了这似乎是可能的之外。

是的,Java反编译器可以管理类似的保真度(意思是:代码看起来相似,但不一定相同)

然而,每种语言都需要一个专用的反编译器

编辑:我想我需要澄清我期望的忠实程度:

  • 局部变量的名称可以复制,也可以不复制
  • 循环类型可能被错误解释(的
    替换为
    ,…)
  • 更一般的情况是:可以用两种类似的方式完成的事情可能会被错误地解释
所有这些都是在反编译Java代码时也会发生的错误,这仅仅是因为字节代码与Java源代码之间的关联不是1:1


然而,如果您有一个专用的Groovy反编译器,那么我怀疑它通过反编译编译编译的Groovy代码产生的可读性比Java反编译器所能产生的要多得多。例如,一种语言可能以一种不可逆的方式损坏它的名称。此外,它还可以将源语言的不同结构映射到单个java语言结构


然而,最重要的是,java语言(与JVM字节码相比)的功能不足以对源语言的某些概念或结构进行编码,从而使它们能够具体化。Java和JVM字节码已经是这样了,后者不能表达泛型。

我不担心注释。但是你要怎么恢复这样的东西?this.metaClass=((元类)ScriptBytecodeAdapter.castToType(tmp12_9,$get$$class$groovy$lang$metaClass());tmp12_9;while(true)返回@那不是字节码。这就是Java语言反编译器试图解释并非由编译Java语言代码产生的字节代码的方式。这必然会产生奇怪的结果,但是一个针对正确语言的专用反编译器会识别“奇怪”的字节码结构,并知道它代表什么语言结构。@Joachim,你是对的,那不是字节码,这就是为什么我没有说它是字节码。我想这是有道理的,如果你知道你在处理一个Groovy生成的类文件,你应该知道你必须用与Java生成的类文件不同的方式来处理它。这确实是一个非常乐观的假设。@Ingo:我不认为这是多么乐观。由有能力的Java反编译器生成的代码与原始源代码也只有基本的相似性。局部变量名称通常会丢失(除非在编译过程中明确包含在
.class
文件中),而且使用的特定循环类型通常也会错误表示(将
for
循环替换为
while
循环).我在我的帖子中表达了我的不同观点。@Ingo:我不认为我们的观点有太大的不同。我只是简单地将queston解释为“专用Groovy反编译器能像专用Java反编译器一样有用吗?”,对此我说:“是的,它也同样无用”;-)关于第二点,我不是要将Groovy生成的Java字节码转换回Java,而是要转换回Groovy。@Alexandru-这正是我的观点-我不知道Groovy,但可以想象它有某些功能,如果不丢失信息,就无法编译成字节码。具有讽刺意味的是,当编译成字节码时,langhuage会丢失信息的一个例子是Java本身,因此可以安全地假设,其他语言的情况更是如此。请注意,编译器会丢弃无法重建的信息,因此您将永远无法恢复原始信息。