【Kotlin】注解 @JvmName 和 @JvmMultifileClass

@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 注解的文件,编译器会自动检测相同的声明,并报错。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容