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

Mel*_*Mel 8 java android kotlin

例如,如果我使用

methodReference = ::method
Run Code Online (Sandbox Code Playgroud)

而不是

methodReference = { method(it) }
Run Code Online (Sandbox Code Playgroud)

由于反射getOwner,反编译的代码将包含Java 代码中的 、getNamegetSignature方法。这些方法是否计入 64k 限制?

Eug*_*nko 7

仅当 proguard/R8 没有删除这些方法时才会计数

一个例子

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

对于reference1字节码(反编译为 Java)将是:

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

对于 lambda(或 reference2),等效的 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() {..}
   };
Run Code Online (Sandbox Code Playgroud)

因此,方法引用的差异是 4 +1,而 lambda 的差异是 1 +1,其中+1来自桥接方法invoke(t:Any)