The document contains code examples showing how Kotlin code is compiled to Java bytecode. It demonstrates how Kotlin classes, functions, properties, and other language features are represented in the compiled Java code. Key aspects that are summarized include data classes, property delegates like lazy, extension functions, and overriding behavior.
11. package com.cwdoh.devfest2017
class Session {
val speaker = "cwdoh"
val title: String
= "Kotlin: How it works"
var room: Int? = null
fun description()
= "$speaker's talk: '$title' at room $room"
}
12.
13. package com.cwdoh.devfest2017
class Session {
val speaker = "cwdoh"
val title: String
= "Kotlin: How it works"
var room: Int? = null
fun description()
= "$speaker's talk: '$title' at room $room"
}
14. class Session {
var name = "cwdoh"
}
public final class Session {
@NotNull
private String name = "cwdoh";
@NotNull
public final String getName() {
return this.name;
}
public final void setName(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.name = var1;
}
}
15. class Session {
val name = "cwdoh"
}
public final class Session {
@NotNull
private final String name = "cwdoh";
@NotNull
public final String getName() {
return this.name;
}
}
16. class Session {
val speaker = "cwdoh"
fun description() {
val talks = "$speaker's talks"
println(talks)
}
}
public final class Session {
@NotNull
private final String speaker = "cwdoh";
@NotNull
public final String getSpeaker() {
return this.speaker;
}
public final void description() {
String talks = "" + this.speaker + "'s talks";
System.out.println(talks);
}
}
17.
18. package com.cwdoh.devfest2017
class Session {
val speaker = "cwdoh"
val title: String
= "Kotlin: How it works"
var room: Int? = null
fun description()
= "$speaker's talk: '$title' at room $room"
}
19. class Session {
var name: String = "cwdoh"
}
public final class Session {
@NotNull
private String name = "cwdoh";
@NotNull
public final String getName() {
return this.name;
}
public final void setName(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.name = var1;
}
}
public static void checkParameterIsNotNull(Object value, String paramName)
{
if (value == null) {
throwParameterIsNullException(paramName);
}
}
20. class Session {
fun hello(name: String) = "hello, " + name
}
public final class Session {
@NotNull
public final String hello(@NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
return "hello, " + name;
}
}
public static void checkParameterIsNotNull(Object value, String paramName)
{
if (value == null) {
throwParameterIsNullException(paramName);
}
}
21. class Session {
fun hello(name: String) = "hello, " + name
fun print() {
val name: String = "cwdoh"
print(hello(name))
}
}
public final class Session {
@NotNull
public final String hello(@NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
return "hello, " + name;
}
public final void print() {
String name = "cwdoh";
String var2 = this.hello(name);
System.out.print(var2);
}
}
22. class Session {
fun hello(name: String) = "hello, " + name
fun print() {
val name: String? = null
print(hello(name!!))
}
}
public final class Session {
@NotNull
public final String hello(@NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
return "hello, " + name;
}
public final void print() {
String name = (String)null;
Intrinsics.throwNpe();
String var2 = this.hello(name);
System.out.print(var2);
}
}
NullPointerException? 😎
23.
24. package com.cwdoh.devfest2017
class Session {
val speaker = "cwdoh"
val title: String
= "Kotlin: How it works"
var room: Int? = null
fun description()
= "$speaker's talk: '$title' at room $room"
}
25. class Session {
val speaker = "cwdoh"
val title: String = "Kotlin: How it works"
var room: Int? = null
fun description() = "$speaker's talk: '$title' at room $room"
}
public final class Session {
@NotNull
private final String speaker = "cwdoh";
@NotNull
private final String title = "Kotlin: How it works";
@Nullable
private Integer room;
…
@NotNull
public final String description() {
return "" + this.speaker + "'s talk: ‘"
+ this.title + "' at room " + this.room;
}
}
29. interface Interface
open class OpenClass
class ChildClass: OpenClass(), Interface
fun test() { val child = ChildClass() }
public final class ChildClass
extends OpenClass implements Interface {}
public interface Interface {}
public class OpenClass {}
public final class SimpleClassKt {
public static final void test() {
new ChildClass();
}
}
30.
31. class Person1 constructor(name: String)
class Person2(name: String)
public final class Person1 {
public Person1(@NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
}
}
public final class Person2 {
public Person2(@NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
}
}
32. class Person constructor(val name: String)
public final class Person {
@NotNull
private final String name;
@NotNull
public final String getName() {
return this.name;
}
public Person(@NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.name = name;
}
}
33. class Person constructor(val name: String) {
val greetings: String
init { greetings = "hello, $name” }
}
public final class Person {
@NotNull private String greetings;
@NotNull private final String name;
@NotNull public final String getGreetings() { return this.greetings; }
@NotNull public final String getName() { return this.name; }
public Person(@NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.name = name;
this.greetings = "hello, " + this.name;
}
}
34. class Person constructor(val name: String) {
val greetings: String
var age: Int = null
constructor(name: String, age: Int): this(name) { this.age = age }
init { greetings = "hello, $name” }
}
public final class Person {
@NotNull
private final String greetings;
private int age;
…
public Person(@NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.name = name;
this.age = ((Number)null).intValue();
this.greetings = "hello, " + this.name;
}
public Person(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name, "name");
this(name);
this.age = age;
}
}
35.
36. open class Parent {
private val a = println("Parent.a")
constructor(arg: Unit=println("Parent primary constructor arg")) {
println("Parent primary constructor")
}
init { println("Parent.init") }
private val b = println("Parent.b")
}
class Child : Parent {
val a = println("Child.a")
init { println("Child.init 1") }
constructor(arg: Unit=println("Child primary constructor arg")) : super() {
println("Child primary constructor")
}
val b = println("Child.b")
constructor(arg: Int, arg2:Unit= println("Child secondary constructor arg")): this() {
println("Child secondary constructor")
}
init { println("Child.init 2") }
}
fun main(args: Array<String>) {
Child(1)
}
Child secondary constructor arg
Child primary constructor arg
Parent primary constructor arg
Parent.a
Parent.init
Parent.b
Parent primary constructor
Child.a
Child.init 1
Child.b
Child.init 2
Child primary constructor
Child secondary constructor
37.
38.
39. class Props {
var size: Int = 0
val isEmpty: Boolean
get() = this.size == 0
}
public final class Props {
private int size;
public final int getSize() {
return this.size;
}
public final void setSize(int var1) {
this.size = var1;
}
public final boolean isEmpty() {
return this.size == 0;
}
}
40. class Props {
var age: Int = 0
set(value: Int) {
age = if (value < 0) 0 else value
}
}
public final class Props {
private int age;
public final int getAge() {
return this.age;
}
public final void setAge(int value) {
this.setAge(value < 0? 0:value);
}
}
41. class Props {
var age: Int = 0
private set
}
public final class Props {
private int age;
public final int getAge() {
return this.age;
}
private final void setAge(int var1) {
this.age = var1;
}
}
42.
43.
44. class MainActivity : AppCompatActivity() {
private var mWelcomeTextView: TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mWelcomeTextView
= findViewById(R.id.msgView) as TextView
}
}
45. class MainActivity : AppCompatActivity() {
private lateinit var mWelcomeTextView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mWelcomeTextView
= findViewById(R.id.msgView) as TextView
}
}
46. class MainActivity : AppCompatActivity() {
private val mWelcomeTextView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Where am I?????
// mWelcomeTextView =
// findViewById(R.id.msgView) as TextView
}
}
47. class MainActivity : AppCompatActivity() {
private val messageView : TextView by lazy {
// following code will be executed at first access
findViewById(R.id.message_view) as TextView
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
fun onSayHello() {
messageView.text = "Hello"
}
}
48.
49. class Delegate {
operator fun getValue(
thisRef: Any?,
property: KProperty<*>
): String {
// do something
// return value
}
operator fun setValue(
thisRef: Any?,
property: KProperty<*>, value: String
) {
// do something
// assign
}
}
50.
51.
52. class Demo {
val myName : String by lazy { "John" }
}
public final class Demo {
// $FF: synthetic field
static final KProperty[] $$delegatedProperties = new KProperty[]{ … };
@NotNull
private final Lazy myName$delegate;
@NotNull
public final String getMyName() {
Lazy var1 = this.myName$delegate;
KProperty var3 = $$delegatedProperties[0];
return (String)var1.getValue();
}
public Demo() {
this.myName$delegate = LazyKt.lazy((Function0)null.INSTANCE);
}
}
53. class Demo {
val myName : String by lazy { getNameFromPreference() }
} initializerdelegate
58. class MainActivity : AppCompatActivity() {
private val messageView : TextView by lazy {
// I’ll be initialized lazily at first access
findViewById(R.id.message_view) as TextView
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
fun onSayHello() {
messageView.text = "Hello"
}
}
61. interface Base {
fun printX()
}
class BaseImpl(val x: Int) : Base {
override fun printX() { print(x) }
}
62. interface A {
fun hello(): String
}
class B : A {
override fun hello() = "Hello!!"
}
class C : A by B()
63. public interface A {
@NotNull
String hello();
}
public final class B implements A {
@NotNull
public String hello() {
return "Hello!!";
}
}
public final class C implements A {
// $FF: synthetic field
private final B $$delegate_0 = new B();
@NotNull
public String hello() {
return this.$$delegate_0.hello();
}
}
64.
65.
66. fun String.hello() : String {
return "Hello, $this"
}
fun main(args: Array<String>) {
val whom = "cwdoh"
println(whom.hello())
}
// Result
Hello, cwdoh
67.
68. open class C
class D: C()
fun C.foo() = "c"
fun D.foo() = "d"
fun printFoo(c: C) {
println(c.foo())
}
class Demo {
fun run() {
printFoo(D())
}
}
public class C {}
public final class D extends C {}
public final class SimpleClassKt {
@NotNull
public static final String foo(@NotNull C $receiver) {
Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
return "c";
}
@NotNull
public static final String foo(@NotNull D $receiver) {
Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
return "d";
}
public static final void printFoo(@NotNull C c) {
Intrinsics.checkParameterIsNotNull(c, "c");
String var1 = foo(c);
System.out.println(var1);
}
}
public final class Demo {
public final void run() {
SimpleClassKt.printFoo((C)(new D()));
}
}
69. class Person {
fun hello() {
println("hello!")
}
}
fun Person.hello() {
println(" ?!!")
}
fun main(args: Array<String>)
{
Person().hello()
}
// Result
hello!
public final class Person {
public final void hello() {
String var1 = "hello!";
System.out.println(var1);
}
}
public final class SimpleClassKt {
public static final void hello(@NotNull Person $receiver) {
Intrinsics.checkParameterIsNotNull(
$receiver, "$receiver");
String var1 = " ?!!";
System.out.println(var1);
}
public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
(new Person()).hello();
}
}
70. class D {
fun bar() {
println("D.bar()")
}
}
class C {
fun baz() {
println("C.bar()")
}
fun D.foo() {
bar() // calls D.bar
baz() // calls C.baz
}
fun caller(d: D) {
d.foo()
}
}
public final class C {
public final void baz() {
String var1 = "C.bar()";
System.out.println(var1);
}
public final void foo(@NotNull D $receiver) {
Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
$receiver.bar();
this.baz();
}
public final void caller(@NotNull D d) {
Intrinsics.checkParameterIsNotNull(d, "d");
this.foo(d);
}
}
public final class D {
public final void bar() {
String var1 = "D.bar()";
System.out.println(var1);
}
}
71.
72. data class Length(var centimeters: Int = 0)
var Length.meters: Float
get() {
return centimeters / 100.0f
}
set(meters: Float) {
this.centimeters = (meters * 100.0f).toInt()
}
73. data class Length(var centimeters: Int = 0)
var Length.meters: Float
get() {
return centimeters / 100.0f
}
set(meters: Float) {
this.centimeters = (meters * 100.0f).toInt()
}
public final class Length {
private int centimeters;
...
}
public final class ExtensionsKt {
public static final float getMeters(
@NotNull Length $receiver) {
Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
return (float)$receiver.getCentimeters() / 100.0F;
}
public static final void setMeters(
@NotNull Length $receiver, float meters) {
Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
$receiver.setCentimeters((int)(meters * 100.0F));
}
...
}
74. fun Any?.toString(): String
{
if (this == null)
return “null"
return toString()
}
public final class SimpleClassKt {
@NotNull
public static final String
toString(@Nullable Object $receiver) {
return $receiver == null?
"null":$receiver.toString();
}
}
75. fun Any?.toString(): String {
println("Extension is called.")
if (this == null) return "null"
return toString()
}
fun main(args: Array<String>) {
val var1 : Any? = null
println(var1.toString())
val str1 : String? = null
println(str1.toString())
var str2 : String? = "hello"
println(str2.toString())
var str3 : String = "world"
println(str3.toString())
}
public final class SimpleClassKt {
@NotNull
public static final String toString(@Nullable Object $receiver) {
String var1 = "Extension is called.";
System.out.println(var1);
return $receiver == null?"null":$receiver.toString();
}
public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, “args");
Object var1 = null;
String str1 = toString(var1);
System.out.println(str1);
str1 = (String)null;
String str2 = toString(str1);
System.out.println(str2);
str2 = "hello";
String str3 = toString(str2);
System.out.println(str3);
str3 = "world";
String var5 = str3.toString();
System.out.println(var5);
}
}
Extension is called.
null
Extension is called.
null
Extension is called.
hello
world
76.
77. fun sing() {
println("We will we will rock you")
println("(Sing it!)")
println("We will we will rock you")
}
fun beatbox() {
println("pv zk bschk pv zk")
}
fun ensemble() {
sing()
beatbox()
sing()
beatbox()
}
public final class SimpleClassKt {
public static final void sing() {
String var0
= "We will we will rock you";
System.out.println(var0);
var0 = "(Sing it!)";
System.out.println(var0);
var0 = "We will we will rock you";
System.out.println(var0);
}
public static final void beatbox() {
String var0 = "pv zk bschk pv zk";
System.out.println(var0);
}
public static final void ensemble() {
sing();
beatbox();
sing();
beatbox();
}
}
78. fun sing() {
println("We will we will rock you")
println("(Sing it!)")
println("We will we will rock you")
}
fun beatbox() {
println("pv zk bschk pv zk")
}
fun ensemble() {
sing()
beatbox()
sing()
beatbox()
}
public final class SimpleClassKt {
public static final void sing() {
String var1 = "We will we will rock you";
…
}
public static final void beatbox() {
…
}
public static final void ensemble() {
String var0
= "We will we will rock you";
System.out.println(var0);
var0 = "(Sing it!)";
System.out.println(var0);
var0 = "We will we will rock you";
System.out.println(var0);
beatbox();
var0 = "We will we will rock you";
System.out.println(var0);
var0 = "(Sing it!)";
System.out.println(var0);
var0 = "We will we will rock you";
System.out.println(var0);
beatbox();
}
}
79. fun log(message: () -> String) {
println(message())
}
fun test() {
log { "Lorem ipsum dolor sit amet, consectetur ..." }
}
public final class SimpleClassKt {
public static final void log(@NotNull Function0 message) {
Intrinsics.checkParameterIsNotNull(message, "message");
Object var1 = message.invoke();
System.out.println(var1);
}
public static final void test() {
log((Function0)null.INSTANCE);
}
}
80. inline fun trace(message: String) {}
fun doSomething() {
print("I'm doing something!")
trace("doSomething() is doing something!")
}
public final class SimpleClassKt {
public static final void trace(@NotNull String message) {
Intrinsics.checkParameterIsNotNull(message, "message");
}
public static final void doSomething() {
String var0 = "I'm doing something!";
System.out.print(var0);
var0 = "doSomething() is doing something!";
}
}
81. inline fun log(message: () -> String) {
println(message())
}
fun test() {
log { "Lorem ipsum dolor sit amet, consectetur ..." }
}
public final class SimpleClassKt {
public static final void log(@NotNull Function0 message) {
Intrinsics.checkParameterIsNotNull(message, "message");
Object var2 = message.invoke();
System.out.println(var2);
}
public static final void test() {
String var0 = "Lorem ipsum dolor sit amet, consectetur ...";
System.out.println(var0);
}
}
82. inline fun trace(message: ()-> String) {}
fun doSomething() {
trace {
val receiver = "nurimaru"
val sender = "cwdoh"
"$sender wanna give $receiver big thank you for good tips."
}
}
public final class SimpleClassKt {
public static final boolean isDebug() {
return true;
}
public static final void trace(@NotNull Function0 message) {
Intrinsics.checkParameterIsNotNull(message, "message");
}
public static final void doSomething() {
}
}