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