Kotlin教程:从Java调用Kotlin代码

2020年4月24日10:32:58 发表评论 256 views

Kotlin与Java语言完全兼容。 所以可以从Kotlin轻松地调用Java代码编写的应用程序。 以类似的方式,Kotlin代码也从Java代码中调用。

在讨论如何从Java代码调用Kotlin代码之前,让我们来看一下Kotlin文件内部的样子。

Kotlin程序内部如何?

MyKotlin.kt 文件中创建一个简单的main函数。

fun main(args: Array<String>){
//code  
}
fun area(l: Int,b: Int):Int{
    return l*b
}
Kotlin

编译上面的Kotlin文件MyKotlin.kt 后,内部看起来像:

public class MyKotlinKt{
    public static void main(String[] args){
        //code  
    }
    public static int area(int a, int b){
        return a*b;
    }
}
Java

Kotlin编译器在内部添加了一个包含命名约定MyKotlinKt的包装类。 Kotlin文件MyKotlin.kt 转换为MyKotlinKt,默认情况下是public。 高级别函数的默认修饰符是public,默认情况下函数转换为static。 由于返回类型是MyKotlin.kt 中的Unit,因此在MyKotlinKt中将其转换为void

从Java代码调用Kotlin代码

文件:MyKotlin.kt

fun main(args: Array<String>){  
//code  
}  
fun area(a: Int, b: Int):Int{
    return a*b
}
Kotlin

文件: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);
    }
}
Java

执行上面Java代码,得到以下结果 -

printing area inside Java class returning from Kotlin file: 20
Shell

Kotlin文件调用Java包内的代码

如果想要从Java类调用不同包中的Kotlin代码,则需要在Java类中导入包含Kotlin文件名的包名,并从Java类调用Kotlin代码。 另一种方法是指定完整路径:packageName.KotlinFileKt.methodName()来调用。

文件:MyKotlinFileKt.kt

package mykotlinpackage

fun main(args: Array<String>) {

}
fun area(l: Int,b: Int):Int{
    return l*b
}
Kotlin

文件:MyJava.java

package myjavapackage;
import mykotlinpackage.MyKotlinFileKt;

public class MyJavaClass {
    public static void main(String[] args){
        int area = MyKotlinFileKt.area(4,8);
        System.out.println("printing area inside Java class returning from Kotlin file: "+area);
    }
}
Java

执行上面Java代码,得到以下结果 -

printing area inside Java class returning from Kotlin file: 32
Shell

使用注解@JvmName更改Kotlin文件名

使用@JvmName注解将Kotlin文件名更改为包类名。

MyKotlin.kt

编写Kotlin代码并在顶部放置注解@file:JvmName("MyKotlinFileName")。 编译Kotlin代码后,文件名将更改为注释中提供的名称(如:MyKotlinFileName)。 在访问MyKotlin.kt的代码时,需要使用文件名:MyKotlinFileName

文件:MyKotlin.kt

@file: JvmName("MyKotlinFileName")
package mykotlinpackage

fun main(args: Array<String>) {

}
fun area(l: Int,b: Int):Int{
    return l*b
}
Kotlin

文件: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);
    }
}
Java

执行上面Java代码,得到以下结果 -

Connected to the target VM, address: '127.0.0.1:62308', transport: 'socket'
printing area inside Java class returning from Kotlin file: 20
Disconnected from the target VM, address: '127.0.0.1:62308', transport: 'socket'
Shell

使用@JvmMultifileClass调用具有相同Java类名的多个文件方法

如果Kotlin的多个文件使用@JvmName注解生成相同的Java文件名,则通常在从Java文件调用时会出错。 但是,Kotlin编译器生成单个Java façade类,其中包含生成的Java文件以及具有相同名称的文件的所有声明。 为了激活façade类,我们在所有文件中使用@JvmMultifileClass注解。

文件:MyKotlin1.kt

@file: JvmName("MyKotlinFileName")
@file:JvmMultifileClass
package mykotlinpackage

fun main(args: Array<String>) {

}
fun area(l: Int,b: Int):Int{
    return l*b
}
Kotlin

文件:MyKotlin2.kt

@file: JvmName("MyKotlinFileName")
@file:JvmMultifileClass
package mykotlinpackage


fun volume(l: Int,b: Int,h: Int):Int{
    return l*b*h
}
Kotlin

文件: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);
    }
}
Java

执行上面Java代码,得到以下结果 -

printing area inside Java class returning from Kotlin file: 20
printing volume inside Java class returning from Kotlin file: 120
Shell

访问Kotlin const修饰符属性

在顶级和类中使用const修饰符注释的Kotlin属性在Java中转换为静态字段。 这些属性是从Java文件访问的,称为static属性。 例如:

文件:MyKotlin.kt

const val MAX = 720
object Obj {
    const val CONST = 1
}
class C {
    companion object {
        const val VERSION = "5.1.1216"
    }
}
Kotlin

文件:MyJava.java

public class MyJava {
    public static void main(String[] args) {
        int c = Obj.CONST;
        int m = MyKotlinKt.MAX;
        String v = C.VERSION;
        System.out.println("const => "+c+"\n, max=> "+m+"\n, version=> "+v);
    }
}
Java

执行上面Java代码,得到以下结果 -

const => 1
, max=> 720
, version=> 5.1.1216

//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/kotlin/kotlin-java-interoperability-calling-kotlin-from-java.html#article-start

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: