📜  Kotlin注释

📅  最后修改于: 2021-01-05 07:54:15             🧑  作者: Mango

Kotlin注释

注释用于在编译时将元数据附加到类,接口,参数等。批注可以由编译器使用,它可以在运行时反映出来。我们可以根据注释值更改数据或程序的含义。

Kotlin元注释

我们可以在声明注释时添加元信息。以下是一些元注释:

Annotation Name Usage
@Target It targets all the possible kinds of elements which can be annotated with the annotation.
@Retention It specifies whether the annotation is stored in the compiled class files or whether it is visible through reflection at run time.
@Repeatable This meta-annotation determines that an annotation is applicable twice or more on a single code element.
@MustBeDocumented This meta-document specifies that the annotation is the part of the public API and should be included in the class or method.

使用注释的示例

@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class MyClass

声明注释

通过将注释修饰符放在类的前面来声明注释。

annotation class MyClass

注释构造函数

也可以注释类的构造函数。这可以通过为构造函数声明添加builder关键字并将注释放在其前面来完成。

class MyClass@Inject constructor( dependency: MyDependency){
//. . . 
} 

注释财产评估员

class MyClass{
var a: MyDependency? = null
                    @Inject set
}

使用构造函数作为注释

我们还可以使用构造函数作为注释。使用构造函数作为注释需要参数。

annotation class MyClass(val why: String)
@MyClass("parameter") 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类,从而可以正常查看批注和参数。

import kotlin.reflect.KClass
annotation class MyClass(val arg1: KClass<*>, val arg2: KClass)
@MyClass(String::class, Int::class) class Foo

使用TYPE注释的示例

创建一个Java注释接口Ann.java

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface  Ann{
int value();
}

创建一个使用注释接口Ann的MyClass.kt类。

@Ann(value = 10)
class MyClass{

}
fun main (args: Array){
var c = MyClass()
var x = c.javaClass.getAnnotation(Ann::class.java)
    if(x!=null){
println("Value:"+x?.value)
    }
}

输出:

Value: 10