- Kotlin环境设置(命令行)
- Kotlin Hello World程序(命令行)
- Kotlin程序概念解释
- Kotlin开发环境设置(IDE)
- Kotlin第一个程序(IDE)
- Kotlin变量
- Kotlin数据类型
- Kotlin类型转换
- Kotlin运算符
- Kotlin表达式、语句和块
- Kotlin标准输入/输出
- Kotlin注释
- 控制流程
- 函数
- 数组
- 字符串
- 异常处理
- 空安全
- 集合
- 注解
- 反射
- Kotlin OOP
- 范围
- Java互操作性
- 正则表达式
从Java调用Kotlin代码
由于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文件MyKotlin.kt 后,内部看起来像:
public class MyKotlinKt{ public static void main(String[] args){ //code } public static int area(int a, int b){ return a*b; } }
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 }
文件: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代码,得到以下结果 -
printing area inside Java class returning from Kotlin file: 20
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 }
文件: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代码,得到以下结果 -
printing area inside Java class returning from Kotlin file: 32
使用注解@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 }
文件: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代码,得到以下结果 -
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'
使用@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 }
文件: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); } }
执行上面Java代码,得到以下结果 -
printing area inside Java class returning from Kotlin file: 20 printing volume inside Java class returning from Kotlin file: 120
访问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" } }
文件: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代码,得到以下结果 -
const => 1 , max=> 720 , version=> 5.1.1216
上一篇:从Kotlin调用Java代码
下一篇:Kotlin正则表达式
扫描二维码
程序员编程王