在 package com.easy.kotlin 包内的 KotlinExample.kt 源文件中声明的所有的函数和属性,包括扩展函数,都将编译成一个名为 com.easy.kotlin.KotlinExampleKt 的 Java 类中的静态方法。
代码示例:
Kotlin的包级属性、函数代码:
package com.easy.kotlin
fun f1() {
println("I am f1")
}
fun f2() {
println("I am f2")
}
val p: String = "PPP"
fun String.swap(index1: Int, index2: Int): String {
val strArray = this.toCharArray()
val tmp = strArray[index1]
strArray[index1] = strArray[index2]
strArray[index2] = tmp
var result = ""
strArray.forEach { result += it }
return result
}
fun main(args: Array<String>) {
println("abc".swap(0, 2))
}
编译成对应的Java的代码:
public final class KotlinExampleKt {
@NotNull
private static final String p = "PPP";
public static final void f1() {
String var0 = "I am f1";
System.out.println(var0);
}
public static final void f2() {
String var0 = "I am f2";
System.out.println(var0);
}
@NotNull
public static final String getP() {
return p;
}
@NotNull
public static final String swap(@NotNull String $receiver, int index1, int index2) {
Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
char[] var10000 = $receiver.toCharArray();
Intrinsics.checkExpressionValueIsNotNull(var10000, "(this as java.lang.String).toCharArray()");
char[] strArray = var10000;
char tmp = strArray[index1];
strArray[index1] = strArray[index2];
strArray[index2] = tmp;
Object result = "";
char[] $receiver$iv = strArray;
for(int var7 = 0; var7 < $receiver$iv.length; ++var7) {
char element$iv = $receiver$iv[var7];
result = result + element$iv;
}
return result;
}
public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
String var1 = swap("abc", 0, 2);
System.out.println(var1);
}
}
我们可以看到,Kotlin中的扩展函数
fun String.swap(index1: Int, index2: Int): String
被编译成
public static final String swap(@NotNull String $receiver, int index1, int index2)
Kotlin中的String. 接收者被当做Java方法中的第一个参数传入。
Java调用Kotlin包级属性、函数的测试代码:
@Test
public void testPackageFun() {
KotlinExampleKt.f1();
KotlinExampleKt.f2();
System.out.println(KotlinExampleKt.getP());
KotlinExampleKt.swap("abc",0,1);
}
运行输出:
I am f1
I am f2
PPP
bac
另外,要注意的这里生成的类KotlinExampleKt,我们不能使用new来创建实例对象:
KotlinExampleKt example = new KotlinExampleKt();// 报错
报如下错误:
error: cannot find symbol
KotlinExampleKt example = new KotlinExampleKt();
^
symbol: constructor KotlinExampleKt()
location: class KotlinExampleKt
1 error
在编程中,我们推荐使用Kotlin默认的命名生成规则。如果确实有特殊场景需要自定义Kotlin包级函数对应的生成Java类的名字,我们可以使用 @JvmName 注解修改生成的 Java 类的类名:
@file:JvmName("MyKotlinExample")
package com.easy.kotlin
fun f3() {
println("I am f3")
}
fun f4() {
println("I am f4")
}
val p2: String = "PPP"
测试代码:
MyKotlinExample.f3();
MyKotlinExample.f4();