Kotlin Decompiler 生成错误代码 - 是否可以预防?
Kotlin Decompiler generates erroneous code - Is it possible to prevent?
class CheckInventory(target: Target) : Command(target) {
}
使用 IntelliJ 的“Show Kotlin bytecode”选项反编译上述 Kotlin 代码时,它会在 super()
调用上方生成一条语句:
class CheckInventory extends Command {
public CheckInventory(Target target) {
Intrinsic.checkParameterIsNotNull(target, "target");
super(target); //error, must be first call
}
}
还有一些其他问题,例如使用 WhenMapping 的访问修饰符生成顶级 类:
public class MyClass {
}
public final class MyClass$WhenMappings { //error, shouldn't be public
}
我检查了 Kotlin 和 IntelliJ 的更新,我都使用了最新版本。
起初我认为这可能与编写糟糕的 Kotlin 代码有关,但即使是最简单的代码文件似乎也需要某种 check/generation,这在 Java 中是非法的。
问题
有什么方法可以确保反编译过程保持在 Java 语言规则的范围内?
没有。 IntelliJ IDEA 中的 Java 反编译器专为反编译 Java 源代码而设计。 Kotlin 编译器从 Java 编译器生成不同的字节码模式,因此 Java 反编译器并不总是生成有效 Java 代码的输出。
class CheckInventory(target: Target) : Command(target) {
}
使用 IntelliJ 的“Show Kotlin bytecode”选项反编译上述 Kotlin 代码时,它会在 super()
调用上方生成一条语句:
class CheckInventory extends Command {
public CheckInventory(Target target) {
Intrinsic.checkParameterIsNotNull(target, "target");
super(target); //error, must be first call
}
}
还有一些其他问题,例如使用 WhenMapping 的访问修饰符生成顶级 类:
public class MyClass {
}
public final class MyClass$WhenMappings { //error, shouldn't be public
}
我检查了 Kotlin 和 IntelliJ 的更新,我都使用了最新版本。
起初我认为这可能与编写糟糕的 Kotlin 代码有关,但即使是最简单的代码文件似乎也需要某种 check/generation,这在 Java 中是非法的。
问题
有什么方法可以确保反编译过程保持在 Java 语言规则的范围内?
没有。 IntelliJ IDEA 中的 Java 反编译器专为反编译 Java 源代码而设计。 Kotlin 编译器从 Java 编译器生成不同的字节码模式,因此 Java 反编译器并不总是生成有效 Java 代码的输出。