📅  最后修改于: 2021-01-05 07:54:15             🧑  作者: Mango
注释用于在编译时将元数据附加到类,接口,参数等。批注可以由编译器使用,它可以在运行时反映出来。我们可以根据注释值更改数据或程序的含义。
我们可以在声明注释时添加元信息。以下是一些元注释:
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
创建一个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