1、在Java中調用Kotlin的方法
在Util.kt文件中聲明瞭一個echo方法:
package kotlin2java
fun echo(name: String) {
println("$name")
}
在JavaMain.java中調用:
UtilKt.echo("kotlin");
這裏注意的是:echo
聲明在文件中,而不是class
中,所以在Java代碼中是通過文件名+kt.方法名
2、Java和Kotlin中調用Kotlin中object修飾的類
在KotlinMain.kt文件中聲明:
object KotlinMain{
fun printObject(){
println("printObject")
}
}
在KotlinMain.kt文件中調用:類名+方法名
fun main(args: Array<String>) {
KotlinMain.printObject()
}
在JavaMain.java文件中調用:類名+INSTANCE+方法名
public class JavaMain {
public static void main(String[] args){
UtilKt.echo("kotlin");
KotlinMain.INSTANCE.printObject();
}
}
這裏的INSTANCE
是如何來的?我們將KotlinMain.kt文件轉換爲Java代碼就能清楚的知道,在被編譯成Java代碼的時候object
修飾的類會生成一個靜態對象INSTANCE
。且看編譯後的代碼:
public final class KotlinMain {
public static final KotlinMain INSTANCE;
public final void printObject() {
String var1 = "printObject";
System.out.println(var1);
}
static {
KotlinMain var0 = new KotlinMain();
INSTANCE = var0;
}
}
看到這段代碼,大家就能輕而易舉的明白在Java代碼中如何調用printObject
方法了。
如何擺脫INSTANCE
Kotlin中被@JvmStatic
修飾的方法,編譯成Java代碼後就變成了一個靜態方法,所以在Java中調用是不需要加上INSTANCE的。
// Koltin
package four
object Utils {
@JvmStatic
fun sayMessage(msg: String?) {
println("$msg")
}
}
// Kotlin編譯成Java後
public final class StaticKotlinFun {
public static final StaticKotlinFun INSTANCE;
@JvmStatic
public static final void sout(@Nullable String msg) {
String var1 = String.valueOf(msg);
System.out.println(var1);
}
static {
StaticKotlinFun var0 = new StaticKotlinFun();
INSTANCE = var0;
}
}
// Java調用
package four;
public class JavaUtil {
public static void main(String[] args) {
Utils.sayMessage(null);
}
}
3、Kotlin中調用class對象(JavaClass和KotlinClass)
fun main(args: Array<String>) {
testJavaClass(JavaMain::class.java)
testKotlinClass(KotlinMain::class.java)
}
fun testJavaClass(clazz: Class<JavaMain>) {
println(clazz.simpleName)
}
fun testKotlinClass(clazz: Class<KotlinMain>) {
println(clazz.simpleName)
}
// 輸出結果:
// JavaMain
// KotlinMain
這裏的JavaMain
是一個java類,而KotlinMain
是一個Kotlin類。
在Kotlin語法中,調用Java的class
必須使用類名::class.java。
但是如果這個參數是Kotlin的類,我們可以寫成和Java一樣的,傳參的時候傳入Class<?>
。那麼既然是Kotlin調用Kotlin,肯定有更加簡單的寫法了,在明確自己調用的是Kotlin類,我們就可以寫成:
fun testKotlinSimpleClass(clazz: KClass<KotlinMain>){
println(clazz.simpleName)
}
// 調用
testKotlinSimpleClass(KotlinMain::class)
這裏我們傳入的不是Class<?>
對象了,而是KClass<?>
對象,在調用的時候也就不用在後面加上.class
,直接使用類名::class就行了。
4、Kotlin調用Java中的變量,此變量名在Kotlin中爲關鍵字:
-
如果Java中聲明的變量的變量名在Kotlin中不是關鍵字,那麼直接用類名.變量名,如:
public class JavaMain { public static String name = "taonce"; } // 調用 println(JavaMain.name)
-
如果Java中聲明的變量的變量名在Kotlin中是關鍵字,再調用上面的寫法編譯器就會發出警告"expecting an element",編譯器都期待有這個元素,所以我們得寫成這樣:
public class JavaMain { public static String in = "in"; } // 調用 println(JavaMain.`in`)
使用一對反引號將變量名包圍起來,這樣編譯器就會正確的執行了。
寫在最後
每個人不是天生就強大,你若不努力,如何證明自己,加油!
Thank You!
--Taonce
如果你覺得這篇文章對你有所幫助,那麼就動動小手指,長按下方的二維碼,關注一波吧~~非常期待大家的加入