Kotlin Decompiler生成错误的代码 - 是否可以防止?

Vin*_*igh 0 java decompiling bytecode intellij-idea kotlin

class CheckInventory(target: Target) : Command(target) {

}
Run Code Online (Sandbox Code Playgroud)

使用IntelliJ的" 显示Kotlin字节码 "选项反编译上述Kotlin代码时,它会在super()调用之上生成一个语句:

class CheckInventory extends Command {
    public CheckInventory(Target target) {
        Intrinsic.checkParameterIsNotNull(target, "target");
        super(target); //error, must be first call
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一些其他问题,例如使用WhenMapping生成具有访问修饰符的顶级类:

public class MyClass {

}

public final class MyClass$WhenMappings { //error, shouldn't be public

}
Run Code Online (Sandbox Code Playgroud)

我检查了Kotlin和IntelliJ更新,我正在使用最新版本.

起初我认为它可能与写得不好的Kotlin代码有关,但即使是最简单的代码文件似乎也需要某种在Java中非法的检查/生成.

有没有办法确保反编译过程保持在Java语言规则的范围内?

yol*_*ole 7

不.IntelliJ IDEA中的Java反编译器是为反编译Java源代码而设计的.Kotlin编译器从Java编译器生成不同的字节码模式,因此Java反编译器并不总是生成有效Java代码的输出.

  • 还要注意,这不仅仅是一个坏的反编译器问题 - 所讨论的字节码实际上不可能变成有效的Java而不会以某种方式影响语义. (5认同)