【发布时间】:2020-12-08 11:13:52
【问题描述】:
我正在开发一些混合 Java 和 Kotlin 的 android 项目。我有一段 Kotlin 代码,我用 Java 反编译了它,看看它是如何实际转换的。
Kotlin 代码
fun postSettingToServer() {
val request = CoockieJsonRequest(Request.Method.POST, URLBuilder.GetPushSettings(this), pushModel!!.toJSON(), null, null)
VolleySingleton.getInstance(applicationContext).addToRequestQueue(request)
}
Android 工作室创建了 Java 等价物
public final void postSettingToServer() {
CoockieJsonRequest var10000 = new CoockieJsonRequest;
String var10003 = URLBuilder.GetPushSettings((Context)this);
Intrinsics.checkExpressionValueIsNotNull(var10003, "URLBuilder.GetPushSettings(this)");
PushSettings var10004 = this.pushModel;
if (var10004 == null) {
Intrinsics.throwNpe();
}
var10000.<init>(1, var10003, var10004.toJSON(), (Listener)null, (ErrorListener)null);
CoockieJsonRequest request = var10000;
VolleySingleton.getInstance(this.getApplicationContext()).addToRequestQueue((Request)request);
}
困扰我的是这个CoockieJsonRequest var10000 = new CoockieJsonRequest;。因此,基本上,在这里我们可以看到代码使用new 运算符将内存分配给CoockieJsonRequest,但不要将其称为构造函数(没有大括号)。取而代之的是,代码执行了一些其他操作(解包 pushModel 对象),然后才使用 JVM <init> 初始化 CoockieJsonRequest。这对我来说看起来很奇怪,因为我一直认为必须在分配对象时构造它。
所以,我的问题 - 它是如何工作的(可以推迟构建)或者 Android Studion Kotlin 反编译器有问题,它只会产生奇怪的反编译输出?
【问题讨论】:
-
您正在查看的 Java 等效项是从 JVM 字节码反编译的。在字节码级别,可以执行该代码所做的事情(参见例如stackoverflow.com/a/53223409/1524450)。 Java代码中是否允许是另一回事。
标签: java android kotlin jvm decompiling