目录
1、Java调用Kotlin代码
我们都知道,如果Java调用Kotlin文件中的代码,需要通过 TestA+kt的形式来调用,那么我们如何在不创建一个Kotlin的class的情况下,实现用 TestA.testName()呢?
那就是 @file:JvmName("TestAA") 注解。
//TestA.kt 中的代码
fun testName() {
println("测试一下class名称")
}
//TestB.java 中的代码
public class TestB {
public static void main(String[] args) {
TestAKt.testName();
}
}
2、JvmName注解
看下面代码使用 @file:JvmName("TestAA") 注解之后,就可以实现用 注解的名字 直接调用函数:TestAA.testName();
注意:@file:JvmName("TestAA")必须写在包名的前面,否则无法起作用
下面有TestA.kt编译后的源码,可以看出,在编译后,会在TestA.kt中生成和注解名称一样的class类。这就是实现用类名直接调用Kotlin文件中方法的一种方式。
//TestA.kt 中的代码
@file:JvmName("TestAA")
package com.yobo.yobo_kotlin.test29_jvmName
fun testName() {
println("测试一下class名称")
}
//TestB.java 中的代码
public class TestB {
public static void main(String[] args) {
TestAA.testName();
}
}
//TestA.kt 编译后的代码
@JvmName(
name = "TestAA"
)
public final class TestAA {
public static final void testName() {
String var0 = "测试一下class名称";
boolean var1 = false;
System.out.println(var0);
}
}
3、JvmMultifileClass注解
如果我们在同一包名下面的两个kt文件中,用@file:JvmName("TestAA") 注解了一样的class名字,会发生什么呢?那就会报错。
怎么解决呢?用 @file:JvmMultifileClass注解可以解决类名相同的问题。
TestA.kt 和 TestC.kt都使用这个注解之后,在文件编译后,会将两个文件的中的方法强制合并到一个class类中,这就是这个注解的原理。
//TestA.kt 中的代码
@file:JvmName("TestAA")
@file:JvmMultifileClass
package com.yobo.yobo_kotlin.test29_jvmName
fun testName() {
println("测试一下class名称")
}
//TestC.kt 中的代码
@file:JvmName("TestAA")
@file:JvmMultifileClass
package com.yobo.yobo_kotlin.test29_jvmName
fun testName1() {
println("测试一下class名称1")
}
//TestB.java 中的代码
public class TestB {
public static void main(String[] args) {
TestAA.testName();
TestAA.testName1();
}
}