@JvmName
一、注解定义
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FILE)
@Retention(AnnotationRetention.BINARY)
@MustBeDocumented
public actual annotation class JvmName(actual val name: String)
注解说明:更改方法名,更改get方法名,更改set方法名,更改文件名
使用说明:该注解可以用在方法前, 文件前(package声明前),get 和 set 方法前。需要传入替换的name。
二、举例说明
1、方法前,get方法,set方法前
@JvmName("start") fun jvmStart(){}
var d:Int = 2
@JvmName("setInt") set
@JvmName("getInt") get
相当于
public final void start() {}//原来是jvmStart
public final int getInt() { return d;}//原来是getD
public final void setInt(int var1) { d = var1;}//原来是setD
2、文件前
如果有一个 StringUtils.kt 文件,写了一些关于 String 的扩展方法,此时生成的是 StringUtilsKt 类,如果需要改成 StringUtils 类,则需要把如下代码写在 package 前:
@file:JvmName(name="StringUtils")
@JvmMultifileClass
一、注解定义
@Target(AnnotationTarget.FILE)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
public actual annotation class JvmMultifileClass
注解说明:不同的文件,用 @file:JvmName 使用相同类名时,使用此注解,合并类
二、使用说明
//TestA.kt
@file:JvmName(name=" TestA")
@file: JvmMultifileClass
//TestB.kt
@file:JvmName(name=" TestA")
@file: JvmMultifileClass
此时将生成一个 TestA.class 类,包含 TestA.kt 和 TestB.kt 文件中的方法和属性(不在任何 class 和 object 中)
相当于
//TestA.kt
final class TestA__TestAKt {}
//TestB.kt
final class TestA__TestBKt {}
public final class TestA {
//包含 TestA.kt 和 TestB.kt 的方法声明和属性,并调用相应的 TestA__TestAKt 类和 TestA__TestBKt 类里的方法和属性的get和set方法
}
注意事项
1. JvmName 的名字不能与同包下的 class 和 object 同名。
2. JvmMultifileClass 注解的文件,编译器会自动检测相同的声明,并报错。