Kotlin-28-JvmName注解(消灭Kt)

目录

1、Java调用Kotlin代码

2、JvmName注解

3、JvmMultifileClass注解


 

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名字,会发生什么呢?那就会报错。

                          

扫描二维码关注公众号,回复: 8860095 查看本文章

怎么解决呢?用 @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();
    }
}

发布了82 篇原创文章 · 获赞 16 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/qq_34589749/article/details/103744477