时间:2021-05-20
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.KClassannotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>)@Ann(String::class, Int::class) class MyClassLambda 表达式
注解也可以用于 lambda 表达式。它们会被应用于生成 lambda 表达式体的 invoke() 方法上。这对于像 Quasar这样的框架很有用, 该框架使用注解进行并发控制。
annotation class Suspendableval f = @Suspendable { Fiber.sleep(10) }注解使用处目标
当对属性或主构造函数参数进行标注时,从相应的 Kotlin 元素 生成的 Java 元素会有多个,因此在生成的 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.Testimport org.junit.Assert.*import org.junit.Ruleimport org.junit.rules.*class Tests { // 将 @Rule 注解应用于属性 getter @get:Rule val tempFolder = TemporaryFolder() @Test fun simple() { val f = tempFolder.newFile() assertEquals(42, getTheAnswer()) }}因为 Java 编写的注解没有定义参数顺序,所以不能使用常规函数调用 语法来传递参数。相反,你需要使用命名参数语法。
// Javapublic @interface Ann { int intValue(); String stringValue();}// Kotlin@Ann(intValue = 1, stringValue = "abc") class C就像在 Java 中一样,一个特殊的情况是 value 参数;它的值无需显式名称指定。
// Javapublic @interface AnnWithValue { String value();}// Kotlin@AnnWithValue("abc") class C如果 Java 中的 value 参数具有数组类型,它会成为 Kotlin 中的一个 vararg 参数:
// Javapublic @interface AnnWithArrayValue { String[] value();}// Kotlin@AnnWithArrayValue("abc", "foo", "bar") class C对于具有数组类型的其他参数,你需要显式使用 arrayOf:
// Javapublic @interface AnnWithArrayMethod { String[] names();}// Kotlin@AnnWithArrayMethod(names = arrayOf("abc", "foo", "bar")) class C注解实例的值会作为属性暴露给 Kotlin 代码。
// Javapublic @interface Ann { int value();}// Kotlinfun foo(ann: Ann) { val i = ann.value}感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Kotlin语言中调用JavaScript方法实例详解Kotlin已被设计为能够与Java平台轻松互操作。它将Java类视为Kotlin类,并且Java也将Ko
Android注解相关文章:AndroidAOP注解Annotation详解(一)AndroidAOP之注解处理解释器详解(二)AndroidAOP注解详解及简
Kotlin开发Android应用实例详解相关文章:关于Kotlin语言的基础介绍:我们简单的知道了Kotlin这门新语言的优势,也接触了一些常见的语法及其简单
详解Kotlin中的面向对象(二)在Kotlin中的面向对象(一)中,介绍了Kotlin类的相关操作,本文将在上文的基础上,继续介绍属性、接口等同样重要的面向对
Kotlin的注解完全兼容Java的注解。声明注解@Target(AnnotationTarget.CLASS,AnnotationTarget.FUNCTIO