java - 解释在 Kotlin 方法上使用 @JvmOverloads 生成的 Java 代码
问题描述
我尝试使用 @JvmOverloads 为 Kotlin 函数创建重载方法。出于好奇,我尝试查看字节码和反编译的 Java 代码。但是,我无法理解 Java 代码。
这是一个简单的 Kotlin 代码
class MyClass {
@JvmOverloads
fun doSomething(a : Int = 200, b : Int = 300){
}
}
下面是反编译的java代码:
public final class MyClass {
@JvmOverloads
public final void doSomething(int a, int b) {
}
// $FF: synthetic method
// $FF: bridge method
@JvmOverloads
public static void doSomething$default(MyClass var0, int var1, int var2, int var3, Object var4) {
if((var3 & 1) != 0) { // What does this do ?
var1 = 200;
}
if((var3 & 2) != 0) { //Where did var3 come from ?
var2 = 300;
}
var0.doSomething(var1, var2);
}
@JvmOverloads
public final void doSomething(int a) {
doSomething$default(this, a, 0, 2, (Object)null);
}
@JvmOverloads
public final void doSomething() {
doSomething$default(this, 0, 0, 3, (Object)null);
}
}
请解释或指出正确的资源,这可以帮助我了解更多相关信息。谢谢。
解决方案
var3
是一个位掩码,指示哪些参数需要替换为默认值。如果设置了位 0,则第一个参数(var1
或a
在源代码中)将替换为默认值 200。如果设置了位 1,var2
则采用默认值 300。1 参数重载将 2 作为位掩码传递(因此仅设置了第 1 位),并且 0 参数过载通过 3(设置了第 0 位和第 1 位)。
推荐阅读
- apache-kafka - 我可以查看发送到 Kafka 的模式的 ID/版本号吗?用于调试目的
- c - 分段错误错误。我正在尝试解析有效负载并提取值并返回值。我在做什么错误?
- javascript - 无法识别元素显示值
- angular - Nativescript - 获取下载应用程序的用户的邮件/姓名
- reactjs - 我如何通过反应组件上的.net核心获取会话数据
- reactjs - 为什么我在 react.js 的 setState 回调中得到旧的状态值
- r - group() id 的组内条目之间的数据差异为 1 个月
- python - 如何使用目录将 xlsx 文件导入 Jupiter 笔记本?
- bootstrap-4 - 引导程序 4:隐藏 btn 组
- javascript - 如何在 Bootstrapvalidator 中验证用逗号或半克隆分隔的多个电子邮件的电子邮件输入字段