dzkoirn
02/14/2017, 5:38 PMclass LazyExample {
val name by lazy {
"Hello World"
}
}
Байткод такой:
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 объекта.