Влияет ли сгенерированный Kotlin байт-код на количество методов? - PullRequest
3 голосов
/ 29 марта 2019

Например, если я использую

methodReference = ::method

вместо

methodReference = { method(it) }
Декомпилированный код

будет содержать методы getOwner, getName, getSignature в коде Java из-за отражения. Эти методы учитываются при ограничении в 64 КБ?

1 Ответ

4 голосов
/ 29 марта 2019

Методы подсчитываются, только если они не удаляются proguard / R8

Пример

  fun method(t : Any) {}
  val reference1: KFunction1<Any, Unit> = ::method
  val reference2: (Any) -> Unit = { method(it) }

Для reference1 байт-код (декомпилированный в Java) будет:

   @NotNull
   final KFunction reference1 = new Function1((X)this) {
      // $FF: synthetic method
      // $FF: bridge method
      public Object invoke(Object var1) {.. }
      public final void invoke(@NotNull Object p1) {..}
      public final KDeclarationContainer getOwner() {..}
      public final String getName() {..}
      public final String getSignature() {..}
   };

для лямбды (или ссылки2) эквивалентный код Java:

   @NotNull
   final Function1 reference2 = (Function1)(new Function1() {
      // $FF: synthetic method
      // $FF: bridge method
      public Object invoke(Object var1) {..}
      public final void invoke(@NotNull Object it) {..}
   });

Таким образом, разница составляет 4 +1 для ссылки на метод и 1 +1 для лямбды, где +1 исходит из метода моста invoke(t:Any)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...