探索kotlin與Java之間的關(guān)系涉枫,Java和kotlin之間互操作邢滑,kotlin為什么可以在jvm上面運行。
一拜银、下載Kotlin編譯器殊鞭,并配置環(huán)境變量
1、下載安裝尼桶、
進入kotlin編譯器官方地址進行下載安裝,或者到github上面下載锯仪,我這里最新的發(fā)行版本是1.3.61泵督。
2、配置環(huán)境變量
我的下載地址是Downloads 庶喜,習慣把下載的內(nèi)容放到資源文件下小腊,即Libraey下面。 配置如下久窟。
移動文件并解壓
mv ~/Downloads/kotlin-compiler-1.3.61.zip ~/Library/
tar -zxvf kotlin-compiler-1.3.61.zi
添加環(huán)境變量
export PATH="~/Library/kotlinc/bin":$PATH
檢查是否設(shè)置成功秩冈,可以使用which命令
which kotlin
which kotlinc
設(shè)置完成后如下圖所示:
二、在控制臺下創(chuàng)建kotlin斥扛,使用編譯器進行編譯并執(zhí)行
1入问、創(chuàng)建kotlin文件
mkdir hello
cd hello
subl HelloKotlin.kt
# 編寫kotlin代碼后保存
注意: 我這里使用的是sublime text對編寫kotlin文件,可以看我之前的教程稀颁,怎么將sublime text集成到命令行中芬失。點擊這里
2、使用 kotlinc 對代碼進行編譯
kotlinc HelloKotlin.kt
我們可以看到匾灶,生成了META-INF和HelloKotlinKt.class棱烂,其中META-INF是一些描述信息。真正生成的是HelloKotlinKt阶女。clss颊糜,在源文件后面增加了Kt后綴哩治。
3、使用kotlin執(zhí)行
kotlin HelloKotlinKt
三衬鱼、javap反編譯分析
通過上面的例子我們發(fā)現(xiàn)业筏,kotlin代碼最終編譯成了.class文件,在JVM上面執(zhí)行馁启,但是kotlin代碼并沒有Java類的定義驾孔。對于java而言他不認識你是什么語言,只認識字節(jié)碼惯疙,要求程序不能脫離函數(shù)和類的概念而存在翠勉,那么它是如果做到的呢?我們使用 javap反編譯工具進行分析霉颠。
1对碌、使用javap分析 kotlin生成的 class文件結(jié)構(gòu)。
javap HelloKotlinKt.class
得到:
Compiled from "HelloKotlin.kt"
public final class HelloKotlinKt {
public static final void main(java.lang.String[]);
}
我們可以看到蒿偎,字節(jié)碼的結(jié)構(gòu)中完全沒有kotlin的內(nèi)容朽们,而是java的內(nèi)容,Java普通的代碼內(nèi)容诉位。
由此我們可以知道通過kotlin編寫的代碼不在任何一個類中骑脱,Kotlinc編譯時候?qū)⒋a放到符合Java規(guī)范的類中。
2苍糠、反編譯所有字節(jié)碼內(nèi)容分析
javap -c HelloKotlinKt.class
如下:
Compiled from "HelloKotlin.kt"
public final class HelloKotlinKt {
public static final void main(java.lang.String[]);
Code:
0: aload_0
1: ldc #9 // String args
3: invokestatic #15 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: ldc #17 // String hello world Kotlin
8: astore_1
9: iconst_0
10: istore_2
11: getstatic #23 // Field java/lang/System.out:Ljava/io/PrintStream;
14: aload_1
15: invokevirtual #29 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
18: return
}
以上代碼可以看到叁丧,kotlin中的 println() 相當于Java中的 System.out.println() 。
四岳瞭、Kotlin打成jar包拥娄,通過java來執(zhí)行
1、將kotlin代碼打包成jar
# -include-runtime 引入運行時需要的環(huán)境
kotlinc HelloKotlin.kt -include-runtime -d HelloKotlin.jar
2瞳筏、使用Java命令執(zhí)行
java -jar HelloKotlin.jar
3稚瘾、解壓jar文件
可以看到里面多了一個kotlin目錄
打開發(fā)現(xiàn)里面是kotlin的包