📅  最后修改于: 2021-01-05 08:11:03             🧑  作者: Mango
由于Kotlin与Java语言完全兼容。这意味着可以轻松从Kotlin调用用Java代码编写的应用程序。同样,还可以从Java代码中调用Kotlin代码。
在讨论如何从Java代码调用Kotlin代码之前,让我们看一下Kotlin文件的内部外观。
让我们在MyKotlin.kt文件中创建一个简单的main函数。
fun main(args: Array){
//code
}
fun area(l: Int,b: Int):Int{
return l*b
}
编译完上面的Kotlin文件MyKotlin.kt后,其内部外观如下:
public class MyKotlinKt{
public static void main(String[] args){
//code
}
public static int area(int l, int b){
return l*b;
}
}
Kotlin编译器在内部添加了具有命名约定MyKotlinKt的包装器类。 Kotlin文件MyKotlin.kt被转换为MyKotlinKt ,默认情况下它是公共的。高级函数的默认修饰符是public,并且默认情况下该函数转换为static 。作为返回值类型是单位在MyKotlin.kt,它被转换成空隙中MyKotlinKt。
MyKotlin.kt
fun main(args: Array){
//code
}
fun area(l: Int,b: Int):Int{
return l*b
}
MyJava.java
public class MyJava {
public static void main(String[] args) {
int area = MyKotlinKt.area(4,5);
System.out.print("printing area inside Java class returning from Kotlin file: "+area);
}
}
输出:
printing area inside Java class returning from Kotlin file: 20
如果我们想从都存在于不同包中的Java类中调用Kotlin代码,则需要在Java类中导入带有Kotlin文件名的包名称,并从Java类中调用Kotlin代码。另一种方法是将完整路径指定为packageName.KotlinFileKt.methodName() 。
MyKotlin.kt
package mykotlinpackage
fun main(args: Array) {
}
fun area(l: Int,b: Int):Int{
return l*b
}
MyJava.java
package myjavapackage;
import mykotlinpackage.MyKotlinFileKt;
public class MyJavaClass {
public static void main(String[] args){
int area = MyKotlinKt.area(4,5);
System.out.println("printing area inside Java class returning from Kotlin file: "+area);
}
}
输出:
printing area inside Java class returning from Kotlin file: 20
可以使用@JvmName批注将Kotlin文件名更改为包装器类名。
MyKotlin.kt
编写Kotlin代码并将注释@file:JvmName(“ MyKotlinFileName”)放在顶部。编译Kotlin代码后,文件名将更改为注释内提供的名称(在我的情况下为MyKotlinFileName )。在访问MyKotlin.kt的代码时,我们需要使用文件名作为MyKotlinFileName 。
@file: JvmName("MyKotlinFileName")
package mykotlinpackage
fun main(args: Array) {
}
fun area(l: Int,b: Int):Int{
return l*b
}
MyJava.java
package myjavapackage;
import mykotlinpackage.MyKotlinFileName;
public class MyJavaClass {
public static void main(String[] args){
int area = MyKotlinFileName.area(4,5);
System.out.println("printing area inside Java class returning from Kotlin file: "+area);
}
}
输出:
printing area inside Java class returning from Kotlin file: 20
如果使用@JvmName批注的Kotlin的多个文件具有相同的生成的Java文件名,则在从Java文件调用时通常会出错。但是,Kotlin编译器会生成单个Javafaçade类,该类包含生成的Java文件以及具有相同名称的文件的所有声明。要激活这一代外观,我们在所有文件中使用@JvmMultifileClass批注。
MyKotlin1.kt
@file: JvmName("MyKotlinFileName")
@file:JvmMultifileClass
package mykotlinpackage
fun main(args: Array) {
}
fun area(l: Int,b: Int):Int{
return l*b
}
MyKotlin2.kt
@file: JvmName("MyKotlinFileName")
@file:JvmMultifileClass
package mykotlinpackage
fun volume(l: Int,b: Int,h: Int):Int{
return l*b*h
}
MyJava.java
package myjavapackage;
import mykotlinpackage.MyKotlinFileName;
public class MyJavaClass {
public static void main(String[] args){
int area = MyKotlinFileName.area(4,5);
System.out.println("printing area inside Java class returning from Kotlin file: "+area);
int vol = MyKotlinFileName.volume(4,5,6);
System.out.println("printing volume inside Java class returning from Kotlin file: "+vol);
}
}
输出:
printing area inside Java class returning from Kotlin file: 20
printing volume inside Java class returning from Kotlin file: 120
在顶层和类中用const修饰符注释的Kotlin属性在Java中转换为静态字段。这些属性可以从Java文件访问,称为静态属性。例如:
MyKotlin.kt
constval MAX = 239
object Obj {
constval CONST = 1
}
class C {
companion object {
constval VERSION = 9
}
}
MyJava.java
public class MyJava {
public static void main(String[] args) {
int c = Obj.CONST;
int m = MyKotlinKt.MAX;
int v = C.VERSION;
System.out.println("const "+c+"\nmax "+m+"\nversion "+v);
}
}
输出:
const 1
max 239
version 9