改进翻译

注解

注解声明

注解是将元数据附加到代码的方法。要声明注解,请将 annotation 修饰符放在类的前面:

annotation class Fancy

注解的附加属性可以通过用元注解标注注解类来指定:

@Target 指定可以用该注解标注的元素的可能的类型(类、函数、属性、表达式等);

@Retention 指定该注解是否存储在编译后的 class 文件中,以及它在运行时能否通过反射可见

(默认都是 true);

@Repeatable 允许在单个元素上多次使用相同的该注解;

@MustBeDocumented 指定该注解是公有 API 的一部分,并且应该包含在生成的 API 文档中显示的类或方法的签名中。

@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 {}

允许的参数类型有:

对应于 Java 原生类型的类型(Int、 Long等);

字符串;

类(Foo::class);

枚举;

其他注解;

上面已列类型的数组。

注解参数不能有可空类型,因为 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)

@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

}

支持的使用处目标的完整列表为:

file;

property(具有此目标的注解对 Java 不可见);

field;

get(属性 getter);

set(属性 setter);

receiver(扩展函数或属性的接收者参数);

param(构造函数参数);

setparam(属性 setter 参数);

delegate(为委托属性存储其委托实例的字段)。

要标注扩展函数的接收者参数,请使用以下语法:

fun @receiver:Fancy String.myExtension() { ... }

如果不指定使用处目标,则根据正在使用的注解的 @Target 注解来选择目标

。如果有多个适用的目标,则使用以下列表中的第一个适用目标:

param;

property;

field.

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

对于具有数组类型的其他参数,你需要显式使用数组字面值语法(自 Kotlin 1.2 起)或者

arrayOf(……):

// Java

public @interface AnnWithArrayMethod {

String[] names();

}

// Kotlin 1.2+:

@AnnWithArrayMethod(names = ["abc", "foo", "bar"])

class C

// 旧版本 Kotlin:

@AnnWithArrayMethod(names = arrayOf("abc", "foo", "bar"))

class D

访问注解实例的属性

注解实例的值会作为属性暴露给 Kotlin 代码:

// Java

public @interface Ann {

int value();

}

// Kotlin

fun foo(ann: Ann) {

val i = ann.value

}

kotlin android 注解,注解 - Kotlin 语言中文站相关推荐

  1. kotlin android获取按钮,Kotlin Android按钮

    Android Button是用于在单击时执行事件的按钮.它是android.widget.Button类下的一个UI组件.要了解有关Android Button的更多信息, 请参阅Android B ...

  2. java 自定义validate_Golang-03 自定义validator,实现java注解功能-Go语言中文社区

    0x00 About 接口开发中, 比较常用的操作就是对输入的参数Bean进行字段属性值校验. 在Java中, 有Annotation(注解)可以让我们方便的在的类上面添加校验信息, 那么在Go中应该 ...

  3. android room 线程,Android协程——RoomCoroutines-Go语言中文社区

    在Room2.1版本中提供了对协程的支持.Dao层的方法可以被suspend标记来确保他们在主线程中被执行.接下来,我们就来看看如何使用并为它写一个简单的单元测试. 为你的数据库加点suspendin ...

  4. kotlin android获取按钮,Kotlin 实现按钮点击跳转监听事件方式

    Kotlin 实现按钮点击跳转监听事件方式 发布时间:2020-10-22 16:31:18 来源:脚本之家 阅读:96 作者:marchelli 例子:首页Guiding页面点击按钮跳转到主页面 p ...

  5. 给Android开发者的kotlin使用

    IO大会上说把Kotlin作为Android官方语言,虽然以前也听过,但是不了解,这不进来看看,尝试自己翻译一下,之前都是看别人的译文,直接看别人翻译过来的,可能可以节省时间,但是理解可能不够深入,加 ...

  6. kotlin android 开源,一款纯Kotlin编写的开源安卓应用 Smile

    原标题:一款纯Kotlin编写的开源安卓应用 "Smile" 本文作者 作者:王英豪 链接: http://blog.csdn.net/yhaolpz/article/detail ...

  7. Kotlin Android Extensions使用指南

    Kotlin Android Extensions是Kotlin团队开发的一个插件,目的是让我们在开发过程中更少的编写代码.目前包括了视图绑定的功能. 几种绑定视图方式对比** xml文件如下 < ...

  8. Android KTX与Kotlin Android Extensions

    Android KTX Android KTX是Google官方推荐的一套便利的Android API扩展函数库.因还处于beta阶段,相关API并不丰富,但既然是出自JakeWharton大神之手, ...

  9. KTX 和 Kotlin android extension 都到底是个啥?

    1. KTX是什么 Android官网对于KTX的介绍:https://developer.android.com/kotlin/ktx KTX 是被称为Android之光的 JakeWharton  ...

  10. kotlin android 4,Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04)

    时间:Aug 16, 2017 原文链接:https://antonioleiva.com/kotlin-android-extensions/ 在 Kotlin1.1.4版本 发布后,原作者依据 K ...

最新文章

  1. python使用pandas通过聚合获取时序数据的最后一个指标数据(例如长度指标、时间指标)生成标签并与原表连接(join)进行不同标签特征的可视化分析
  2. 发改委最新《产业结构调整目录》公布!数据中心列入鼓励产业条目
  3. 北京中考计算机,规则丨2018考生:2017北京中考统招计算机录取规则
  4. WeChat生成授权的token:md5(随机字符串+时间戳+盐值)
  5. 一流大学计算机专业,计算机专业一流大学太难考,不妨退而求其次,看看这5所大学...
  6. c语言中- gt he,C语言中deta,fabs,lt;stdlib.hgt;,lt;stdio.hgt;分别是什么意思
  7. pd17虚拟机启动器生成方法
  8. test luasql's postgresql driver performance (not better than pgbench)
  9. expect+shell脚本实现免密登录
  10. 信息理论-信源及信源熵
  11. Ceph分布式存储系列(六):对象存储、块存储、文件存储的区别和优缺点
  12. python批量修改图片大小_Python3 批量修改JPG图片尺寸?
  13. C#视频采集方法对比
  14. 如何进行航拍全景摄影(上)
  15. 计算机网络 子网掩码
  16. javascript检测浏览器是否需要升级版本和提示
  17. 【思科模拟器实验】交换机端口聚合
  18. 大牛养成指南(1):吃的草够多,你也能成为大牛
  19. 「凹凸数据」历史文章合集,更新中
  20. 网络文化与伦理【0948】

热门文章

  1. java找不到符号IOException_BufferWriterTest.java:找不到符号
  2. pythonddos防御_一个自动封IP防御DDOS脚本
  3. 360怎么看电脑配置_电脑配置清单速查表-AMD
  4. android 预优化oat_Android内存优化大盘点
  5. Android 动态调试和JEB启动调试命令
  6. Scatter-gather DMA 与 block DMA
  7. 解决安装驱动时提示的“未签名的驱动程序”警告信息!!
  8. FAT32U盘挂载无法更改权限记录
  9. cat more正常 vim显示中文乱码问题
  10. SpringBoot(二)