目录
注解:@file:JvmName
注解:@JvmField
注解:@JvmOverloads
注解:@JvmStatic
注解:@JvmMultifileClass
注解:@JvmSynthetic
注解:@file:JvmName
@file:JvmName(“XXX”) 放在类的最顶层,给当前类换一个名字,jvm在编译时会替换
@JvmName("XXX") 可以替换方法的名字
Kt文件
java文件
code:KT
@file:JvmName("Stu")
package com.example.lib
var name = null
@JvmName("sn")
inline fun showName() {
println(name)
}
java
package com.example.lib;
public class MyCla {
public static void main(String[] args) {
//没有添加@file:JvmName("Stu") 之前调用
//OutAKt.showName();
//没有添加@JvmName("sn")之前调用 showName()方法
//Stu.showName();
//添加类 注释 @file:JvmName("Stu") 和 方法注释@JvmName("sn")后
Stu.sn();
}
}
注解:@JvmField
@JvmField 给成员添加该标签,剔除私有代码,之后就可以直接调用了。
使Kotlin编译器不再对该字段生成getter/setter并将其作为公开字段
code:KT
class Peop3{
//@JvmField
val name = listOf("张三","李四","王五")
}
java
Peop3 person = new Peop3();
//添加@JvmFiled前,只能调用类中的get/set方法,不能直接调用属性
for (String name : person.getName()) {
System.out.println(name);
}
添加注解后
code:KT
class Peop3{
@JvmField
val name = listOf("张三","李四","王五")
}
java
Peop3 person = new Peop3();
//添加@JvmFiled前,只能调用类中的get/set方法,不能直接调用属性
// for (String name : person.getName()) {
// System.out.println(name);
// }
//添加@JvmFiled后,可以直接调用类对应属性
for (String name : person.name) {
System.out.println(name);
}
注解:@JvmOverloads
@JvmOverLoads KT的方法中有默认参数的,java无法享用,给方法添加该标签之后就可以了,
编译器会帮你重载一个对应的方法给你调用,之后再方法里面再调用原来的方法。
但java不能直接调用缺省参数,报错
添加注解后编译通过
注解:@JvmStatic
@JvmStatic 给对象的成员添加属性变成静态可以直接调用,在KT的半生类companion中,实际生成的是一个静态内部类,你如果给一个方法添加该标签,实际上外面会生成一个静态方法,但是最终方法里面还是会调用回companion里面,JVM没那么傻生成两个方法
未添加注解前
添加注解后
注解:@JvmMultifileClass
这个注解让Kotlin编译器生成一个多文件类,该文件具有在此文件中声明的顶级函数和属性作为其中的一部分,JvmName注解提供了相应的多文件的名称。
使用场景:
我们可以看到使用注解以后将A和B文件中的方法合在了一个Utils类中,这个注解可以消除我们去手动创建一个Utils类,向Utils类中添加方法更加灵活和方便
注解:@JvmSynthetic
如果你写的⼀个函数你只想给kotlin代码调⽤ ⽽不想给java的代码调⽤ 那你就在你的函数上⾯加上这个注解即可