@file:JvmName("Test")  必须写在文件首行之上
Test.kt 编译后生成 TestKt -- java 端 调用  TestKt.test()
JvmName 编译后生成 Test   -- java 端 调用  Test.test()

@JvmField  -- 消除kotlin的默认私有访问权限,使Java端可以以public调用
 var name = "Allen"  -- private String name = "Allen"  new Person().getName() ,伴生可直接
 @JvmField
 var name = "Allen"  -- public String name = "Allen"   new Person().name

@JvmOverloads
fun method(name : String, age : Int = 18){
    println("我的名字是: ${name},我今年 $age 岁了")
}
kotlin 端 只传 name一个参数即可 , java 有缺省值的 情况下 也要传递 全参
加上 @JvmOverloads  强制  重载  就可以传递 任意参数  1 or 2

@JvmStatic
class Person_Test{
    companion object{
        fun showMethod(name : String){
            println("${name} 今年18岁了")
        }
    }
}

KT     Person_Test.showMethod("Allen")
java   Person_Test.Companion.showMethod("Allen");
companion object 反编译后其实又生成了一个Companion类 ,showMethod被封装在了里面 所以  Person_Test.Companion.showMethod
@JvmStatic -- 类中 封装了一个static 的showMethod ,然后也是调用了Companion里面的showMethod方法  -- Person_Test.showMethod("Allen")

总结:
1.@JvmName:便于去修改kt文件背后生成的类名,必须写在包名上面
2.@JvmField: 消除kotlin的默认私有访问权限,无需  get
3.@JvmOverloads: 生成重载方法,便于Java在调用有 默认值 参数的函数的时候 可以仅传入无默认值的那些参数
4.@JvmStatic:使Java在调用派生类Companion Object的函数使能够像调用static方法一样,直接xx类 . xx方法
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐