Всем привет. Я снова пришел со странным байт кодом...
# russian
d
Всем привет. Я снова пришел со странным байт кодом. Kotlin 1.0.6 код такой:
Copy code
class LazyExample {
    val name by lazy {
        "Hello World"
    }
}
Байткод такой:
Copy code
dzmitry@dzmitry-desktop:~/Projects/kotlin_under_hood/build/classes/main$ javap -c LazyExample.class 
Compiled from "LazyExample.kt"
public final class LazyExample {
  public final java.lang.String getName();
    Code:
       0: aload_0
       1: getfield      #11                 // Field name$delegate:Lkotlin/Lazy;
       4: astore_1
       5: aload_0
       6: astore_2
       7: getstatic     #15                 // Field $$delegatedProperties:[Lkotlin/reflect/KProperty;
      10: iconst_0
      11: aaload
      12: astore_3
      13: nop
      14: aload_1
      15: invokeinterface #21,  1           // InterfaceMethod kotlin/Lazy.getValue:()Ljava/lang/Object;
      20: checkcast     #23                 // class java/lang/String
      23: areturn

  public LazyExample();
    Code:
       0: aload_0
       1: invokespecial #29                 // Method java/lang/Object."<init>":()V
       4: aload_0
       5: getstatic     #35                 // Field LazyExample$name$2.INSTANCE:LLazyExample$name$2;
       8: checkcast     #37                 // class kotlin/jvm/functions/Function0
      11: invokestatic  #43                 // Method kotlin/LazyKt.lazy:(Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy;
      14: putfield      #11                 // Field name$delegate:Lkotlin/Lazy;
      17: return

  static {};
    Code:
       0: iconst_1
       1: anewarray     #58                 // class kotlin/reflect/KProperty
       4: dup
       5: iconst_0
       6: new           #60                 // class kotlin/jvm/internal/PropertyReference1Impl
       9: dup
      10: ldc           #2                  // class LazyExample
      12: invokestatic  #66                 // Method kotlin/jvm/internal/Reflection.getOrCreateKotlinClass:(Ljava/lang/Class;)Lkotlin/reflect/KClass;
      15: ldc           #67                 // String name
      17: ldc           #69                 // String getName()Ljava/lang/String;
      19: invokespecial #72                 // Method kotlin/jvm/internal/PropertyReference1Impl."<init>":(Lkotlin/reflect/KDeclarationContainer;Ljava/lang/String;Ljava/lang/String;)V
      22: invokestatic  #76                 // Method kotlin/jvm/internal/Reflection.property1:(Lkotlin/jvm/internal/PropertyReference1;)Lkotlin/reflect/KProperty1;
      25: checkcast     #58                 // class kotlin/reflect/KProperty
      28: aastore
      29: putstatic     #15                 // Field $$delegatedProperties:[Lkotlin/reflect/KProperty;
      32: return
}
Тут в getName() как я понял создаются 3 локальные переменные:kotlin.Lazy, kotlin.reflect.KProperty и еще одна которая ссылается на this. 2 из них никак не используются. Вызывается только метод у Lazy объекта.