Объясните код Java, сгенерированный с использованием @JvmOverloads в методе Kotlin - PullRequest
0 голосов
/ 19 сентября 2018

Я пытался использовать @JvmOverloads для создания перегруженных методов для функции Kotlin.Просто из любопытства я попытался взглянуть на байт-код и декомпилированный код Java.Но я не мог понять смысл кода Java.

Вот простой код Котлина

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);
   }
}

Пожалуйста, объясните или укажите нужные ресурсы, которые могут помочья узнаю больше о том же.Спасибо.

1 Ответ

0 голосов
/ 19 сентября 2018

var3 - битовая маска, указывающая, какие параметры необходимо заменить значениями по умолчанию.Если бит 0 установлен, первый параметр (var1 или a в исходном коде) заменяется значением по умолчанию 200. Если бит 1 установлен, var2 принимает значение по умолчанию 300. Параметр 1перегрузка проходит 2 как битовую маску (поэтому установлен только бит 1), а перегрузка 0-параметра проходит 3 (биты 0 и 1 установлены).

...