本文概述
- 一个简单的Kotlin程序在内部看起来如何。
- 从Java代码调用Kotlin代码
- 包含在包中的Java代码调用Kotlin文件
- 使用注解@JvmName更改Kotlin文件名
- 使用@JvmMultifileClass调用具有相同生成的Java类名称的多个文件的方法
- 通过const修饰符访问Kotlin属性
在讨论如何从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 l, int b){return l*b;
}}
Kotlin编译器在内部添加了具有命名约定MyKotlinKt的包装器类。 Kotlin文件MyKotlin.kt会转换为MyKotlinKt, 并且默认情况下是公开的。高级函数的默认修饰符是public, 并且默认情况下该函数转换为static。由于返回类型在MyKotlin.kt中为Unit, 因此在MyKotlinKt中将其转换为void。
从Java代码调用Kotlin代码MyKotlin.kt
fun main(args: Array<
String>
){//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文件名的包名称, 并从Java类中调用Kotlin代码。另一种方法是将完整路径指定为packageName.KotlinFileKt.methodName()。
MyKotlin.kt
package mykotlinpackagefun 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 = 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文件名可以使用@JvmName批注将Kotlin文件名更改为包装器类名。
MyKotlin.kt
编写Kotlin代码并将注释@file:JvmName(“ MyKotlinFileName”)放在顶部。编译Kotlin代码后, 文件名将更改为注释内提供的名称(在我的情况下为MyKotlinFileName)。在访问MyKotlin.kt的代码时, 我们需要使用文件名作为MyKotlinFileName。
@file: JvmName("MyKotlinFileName")package mykotlinpackagefun 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);
}}
输出:
printing area inside Java class returning from Kotlin file: 20
使用@JvmMultifileClass调用具有相同生成的Java类名称的多个文件的方法如果Kotlin的多个文件使用@JvmName批注具有相同的生成的Java文件名, 通常在从Java文件调用时会出错。但是, Kotlin编译器会生成单个Javafa?ade类, 其中包含生成的Java文件以及具有相同名称的文件的所有声明。要激活此生成外观, 我们在所有文件中使用@JvmMultifileClass批注。
MyKotlin1.kt
@file: JvmName("MyKotlinFileName")@file:JvmMultifileClasspackage mykotlinpackagefun main(args: Array<
String>
) {}fun area(l: Int, b: Int):Int{return l*b}
MyKotlin2.kt
@file: JvmName("MyKotlinFileName")@file:JvmMultifileClasspackage mykotlinpackagefun 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: 20printing volume inside Java class returning from Kotlin file: 120
通过const修饰符访问Kotlin属性在顶层和类中用const修饰符注释的Kotlin属性在Java中转换为静态字段。这些属性可以从Java文件访问, 称为静态属性。例如:
MyKotlin.kt
constval MAX = 239object 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);
}}
【Java互操作性(从Java调用Kotlin代码)】输出:
const 1max 239version 9
推荐阅读
- Kotlin实用程序功能
- Java互操作性
- Win10系统Office个人设置无法加载怎样办?
- Win10系统应用更新失败出错代码803F7000的处理办法
- 运用命令查看Win10系统关闭方式的办法
- win10系统家庭版升级为专业版的图文详细教程
- Win10创建WiFi热点提示“无法打开承载网络”怎样办
- win10系统隐藏回收站图标的办法
- Win10系统找到被误删的回收站图标的办法