Kotlin生成的字节码会影响方法计数吗?

时间:2019-03-29 15:35:42

标签: java android kotlin

例如,如果我使用

methodReference = ::method

而不是

methodReference = { method(it) }
由于反射,

反编译的代码将在Java代码中包含getOwnergetNamegetSignature方法。这些方法是否计入64k限制?

1 个答案:

答案 0 :(得分:4)

仅当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() {..}
   };

对于lambda(或reference2),等效的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,lambda的差异为1 +1,其中+1来自桥接方法invoke(t:Any)