Kotlin 的注解类详解及实例

注解声明
注解是将元数据附加到代码的方法。要声明注解,请将 annotation 修饰符放在类的前面:
annotation class Fancy
注解的附加属性可以通过用元注解标注注解类来指定:
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class Fancy
用法
@Fancy class Foo {
@Fancy fun baz(@Fancy foo: Int): Int {
return (@Fancy 1)
}
}
如果需要对类的主构造函数进行标注,则需要在构造函数声明中添加 constructor 关键字 ,并将注解添加到其前面:
class Foo @Inject constructor(dependency: MyDependency) {
// ……
}
你也可以标注属性访问器:
class Foo {
var x: MyDependency? = null
@Inject set
}
构造函数
注解可以有接受参数的构造函数。
annotation class Special(val why: String)
@Special("example") class Foo {}
允许的参数类型有:
注解参数不能有可空类型,因为 JVM 不支持将 null 作为 注解属性的值存储。
如果注解用作另一个注解的参数,则其名称不以 @ 字符为前缀:
annotation class ReplaceWith(val expression: String)
annotation class Deprecated(
val message: String,
val replaceWith: ReplaceWith = ReplaceWith(""))
@Deprecated("This function is deprecated, use === instead", ReplaceWith("this === other"))
如果需要将一个类指定为注解的参数,请使用 Kotlin 类 (KClass)。Kotlin 编译器会 自动将其转换为 Java 类,以便 Java 代码能够正常看到该注解和参数 。
import kotlin.reflect.KClass annotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>) @Ann(String::class, Int::class) class MyClass
Lambda 表达式
注解也可以用于 lambda 表达式。它们会被应用于生成 lambda 表达式体的 invoke() 方法上。这对于像 Quasar这样的框架很有用, 该框架使用注解进行并发控制。
annotation class Suspendable
val f = @Suspendable { Fiber.sleep(10) }
注解使用处目标
当对属性或主构造函数参数进行标注时,从相应的 Kotlin 元素 生成的 Java 元素会有多个,因此在生成的 Java 字节码中该注解有多个可能位置 。如果要指定精确地指定应该如何生成该注解,请使用以下语法:
class Example(@field:Ann val foo, // 标注 Java 字段
@get:Ann val bar, // 标注 Java getter
@param:Ann val quux) // 标注 Java 构造函数参数
可以使用相同的语法来标注整个文件。 要做到这一点,把带有目标 file 的注解放在 文件的顶层、package 指令之前或者在所有导入之前(如果文件在默认包中的话):
@file:JvmName("Foo")
package org.jetbrains.demo
如果你对同一目标有多个注解,那么可以这样来避免目标重复——在目标后面添加方括号 并将所有注解放在方括号内:
class Example {
@set:[Inject VisibleForTesting]
var collaborator: Collaborator
}
支持的使用处目标的完整列表为:
要标注扩展函数的接收者参数,请使用以下语法:
fun @receiver:Fancy String.myExtension() { }
如果不指定使用处目标,则根据正在使用的注解的 @Target 注解来选择目标 。如果有多个适用的目标,则使用以下列表中的第一个适用目标:
Java 注解
Java 注解与 Kotlin 100% 兼容:
import org.junit.Test
import org.junit.Assert.*
import org.junit.Rule
import org.junit.rules.*
class Tests {
// 将 @Rule 注解应用于属性 getter
@get:Rule val tempFolder = TemporaryFolder()
@Test fun simple() {
val f = tempFolder.newFile()
assertEquals(42, getTheAnswer())
}
}
因为 Java 编写的注解没有定义参数顺序,所以不能使用常规函数调用 语法来传递参数。相反,你需要使用命名参数语法。
// Java
public @interface Ann {
int intValue();
String stringValue();
}
// Kotlin
@Ann(intValue = 1, stringValue = "abc") class C
就像在 Java 中一样,一个特殊的情况是 value 参数;它的值无需显式名称指定。
// Java
public @interface AnnWithValue {
String value();
}
// Kotlin
@AnnWithValue("abc") class C
如果 Java 中的 value 参数具有数组类型,它会成为 Kotlin 中的一个 vararg 参数:
// Java
public @interface AnnWithArrayValue {
String[] value();
}
// Kotlin
@AnnWithArrayValue("abc", "foo", "bar") class C
对于具有数组类型的其他参数,你需要显式使用 arrayOf:
// Java
public @interface AnnWithArrayMethod {
String[] names();
}
// Kotlin
@AnnWithArrayMethod(names = arrayOf("abc", "foo", "bar")) class C
注解实例的值会作为属性暴露给 Kotlin 代码。
// Java
public @interface Ann {
int value();
}
// Kotlin
fun foo(ann: Ann) {
val i = ann.value
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Kotlin
# 的注解类
# 注解详解
# Kotlin注解实现Parcelable序列化流程详解
# Kotlin注解与反射的定义及创建使用详解
# Kotlin中@JvmOverloads注解作用示例介绍
# Android kotlin使用注解实现防按钮连点功能的示例
# 教你一文搞懂Kotlin中的Jvm注解
# Kotlin基础学习之Deprecated与Suppress注解使用
# kotlin 注解 @Parcelize 使用示例和步骤详解
# 多个
# 放在
# 请使用
# 并将
# 都是
# 会有
# 就像
# 第一个
# 可以用
# 将其
# 要在
# 可以通过
# 希望能
# 能有
# 你对
# 不支持
# 可以使用
# 应用于
# 它在
# 请将
相关文章:
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何用美橙互联一键搭建多站合一网站?
如何在云主机快速搭建网站站点?
网站app免费制作软件,能免费看各大网站视频的手机app?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
无锡营销型网站制作公司,无锡网选车牌流程?
怀化网站制作公司,怀化新生儿上户网上办理流程?
一键网站制作软件,义乌购一件代发流程?
如何高效完成独享虚拟主机建站?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
如何安全更换建站之星模板并保留数据?
如何快速上传自定义模板至建站之星?
招商网站制作流程,网站招商广告语?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何做网站制作流程,*游戏网站怎么搭建?
如何使用Golang table-driven基准测试_多组数据测量函数效率
Swift中swift中的switch 语句
,购物网站怎么盈利呢?
建站ABC备案流程中有哪些关键注意事项?
如何在建站之星绑定自定义域名?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
如何挑选最适合建站的高性能VPS主机?
,制作一个手机app网站要多少钱?
如何快速建站并高效导出源代码?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
高性能网站服务器部署指南:稳定运行与安全配置优化方案
设计网站制作公司有哪些,制作网页教程?
如何通过建站之星自助学习解决操作问题?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何确保西部建站助手FTP传输的安全性?
建站之星展会模版如何一键下载生成?
营销式网站制作方案,销售哪个网站招聘效果最好?
如何解决VPS建站LNMP环境配置常见问题?
临沂网站制作公司有哪些,临沂第四中学官网?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
阿里云网站制作公司,阿里云快速搭建网站好用吗?
建站之星安装模板失败:服务器环境不兼容?
已有域名和空间,如何快速搭建网站?
如何通过西部建站助手安装IIS服务器?
如何选择服务器才能高效搭建专属网站?
,网站推广常用方法?
制作电商网页,电商供应链怎么做?
如何在Golang中使用replace替换模块_指定本地或远程路径
如何在香港免费服务器上快速搭建网站?
如何选择高效响应式自助建站源码系统?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
香港服务器租用每月最低只需15元?
*请认真填写需求信息,我们会在24小时内与您取得联系。