首页 > 解决方案 > 解释在 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);
   }
}

请解释或指出正确的资源,这可以帮助我了解更多相关信息。谢谢。

标签: javakotlinjvmoverloading

解决方案


var3是一个位掩码,指示哪些参数需要替换为默认值。如果设置了位 0,则第一个参数(var1a在源代码中)将替换为默认值 200。如果设置了位 1,var2则采用默认值 300。1 参数重载将 2 作为位掩码传递(因此仅设置了第 1 位),并且 0 参数过载通过 3(设置了第 0 位和第 1 位)。


推荐阅读