总结在最下面:
一.@JvmName : 修改原kt文件对应的类目
用法:
@file:JvmName("Kt_ZhuJie")
package com.practice.day03
必须写在包名上面否则报错
用处:
对于kt文件
反编译后生成的类:ZhujieKt,是自动生成的,不能自己随心所欲的命名
在Java端调用就必须是:
ZhujieKt.show();
而加了注解后:
@file:JvmName("Kt_text")
package com.practice.day03
这样就可以自己改变类的名字了,Java中调用就可以直接
Kt_text.show();
二. @JvmField : 消除kotlin的默认私有访问权限,使Java端可以以public调用
var name = "Allen"
未添加注解前:
反编译:
添加注解后:
@JvmField
var name = "Allen"
反编译:
这样在Java端就可以正常调用了
三. @JvmOverloads : 使Kotlin的方法得到重载,Java端方便调用
在kotlin使用方法的参数默认值:
为加注解时:
fun method(name : String, age : Int = 18){
println("我的名字是: ${name},我今年 $age 岁了")
}
Kotlin端调用:
println(method("Allen"))
根据Kotlin参数的默认值机制,在Kotlin端可以只传入一个参数,不会报错
而Java端调用Kotlin端的代码,则必须传入俩个参数,否则报错
看一下反编译:
所以在Java端必须把俩个参数都写完整
而加了注解后反编译:
生成的函数是这个,所以在Java端调用的时候只需要传入一个参数即可
四. @JvmStatic : 把Companion object里面的内容拿出来放在外面,便于Java端直接调用
直接上例子感受一下:
未加注解前:
class Person_Test{
companion object{
val name = "Allen"
fun showMethod(name : String){
println("${name} 今年18岁了")
}
}
}
对于这个类,kotlin端调用showMethod的时候非常方便,跟Java的Static一样,直接:
Person_Test.showMethod("Allen")
而在Java端必须这样:
Person_Test.Companion.showMethod("Allen");
//Person_Test.showMethod("Allen");会报错
至于Java为什么要这么调用具体原因得看反编译后的结果:
companion abject反编译后其实又生成了一个Companion类,然后showMethod被封装在了里面,因此在Java端调用的时候必须加上Compaion,去调用它里面的方法
加了注解后:
@JvmStatic
fun showMethod(name : String){
println("${name} 今年18岁了")
}
Java端就可以直接这样调用:
Person_Test.showMethod("Allen");