先看下效果
我們先來看一下kotlin中的註解Annotation.kt:
package kotlin.annotation
import kotlin.annotation.AnnotationTarget.*
public enum class AnnotationTarget {
/** 類、接口或對象 */
CLASS,
/** 僅註釋類 */
ANNOTATION_CLASS,
/** 泛型類型參數(尚不支持)*/
TYPE_PARAMETER,
/** Property */
PROPERTY,
/** 屬性變量 */
FIELD,
/** 局部變量*/
LOCAL_VARIABLE,
/** 函數或構造函數的參數 */
VALUE_PARAMETER,
/** 僅構造函數 */
CONSTRUCTOR,
/** 函數(不包括構造函數) */
FUNCTION,
/** 僅屬性getter */
PROPERTY_GETTER,
/** 僅屬性setter */
PROPERTY_SETTER,
/** Type usage */
TYPE,
/** Any expression */
EXPRESSION,
/** 文件 */
FILE,
/** Type alias */
@SinceKotlin("1.1")
TYPEALIAS
}
public enum class AnnotationRetention {
/** 在源文件中有效(即源文件保留) */
SOURCE,
/** 註釋存儲在二進制輸出中,但對反射不可見 */
BINARY,
/** 在運行時有效(即運行時保留)*/
RUNTIME
}
@Target(AnnotationTarget.ANNOTATION_CLASS)
@MustBeDocumented
public annotation class Target(vararg val allowedTargets: AnnotationTarget)
@Target(AnnotationTarget.ANNOTATION_CLASS)
public annotation class Retention(val value: AnnotationRetention = AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.ANNOTATION_CLASS)
public annotation class Repeatable
@Target(AnnotationTarget.ANNOTATION_CLASS)
public annotation class MustBeDocumented
使用方法:
創建file:KTAnnotation.kt (所有都寫到一個kt文件中,方便測試和使用),
完整代碼如下所示,簡單易用
package com.i.mvvmdemo
//-------------------------------定義註解---------------------------------------
@Target(
//類註解
AnnotationTarget.CLASS,
//屬性變量註解
AnnotationTarget.FIELD,
//函數方法註解
AnnotationTarget.FUNCTION,
//方法參數註解
AnnotationTarget.VALUE_PARAMETER
)
@Retention(AnnotationRetention.RUNTIME)
annotation class RequestParam(val name: String, val value: String)
//-------------------------------使用註解---------------------------------------
@RequestParam(name = "nnn", value = "vvv")
class UserRequest {
@RequestParam(name = "小明", value = "男生")
private var age = 18
@RequestParam(name = "張飛", value = "大口吃飯")
private fun eat(
@RequestParam(name = "吃什麼?", value = "白米飯") food: String,
@RequestParam(name = "喝什麼?", value = "水") drink: String
) {
}
}
//-------------------------------獲取註解的值---------------------------------------
//獲取類上面的註解
fun getClassAnnotaion() {
val clazz = UserRequest::class.java
val annotation = clazz.getAnnotation(RequestParam::class.java)
println("類註解的值:${annotation?.name},${annotation?.value}")
}
//獲取屬性變量上面的註解
fun getFieldAnnotaion() {
val clazz = UserRequest::class.java
val annotations = clazz.declaredFields
for (i in annotations) {
val annotation = i.getAnnotation(RequestParam::class.java)
println("屬性變量註解的值:${annotation?.name},${annotation?.value}")
}
}
//獲取函數上面的註解
fun getFunctionAnnotaion() {
val clazz = UserRequest::class.java
val annotations = clazz.declaredMethods
for (i in annotations) {
val annotation = i.getAnnotation(RequestParam::class.java)
println("函數註解的值:${annotation?.name},${annotation?.value}")
}
}
//獲取方法參數上註解的值
fun getParameterAnnotaion() {
val clazz = UserRequest::class.java
val method = clazz.getDeclaredMethod("eat", String::class.java, String::class.java)
val parameterAnnotations = method.parameterAnnotations
for (iss in parameterAnnotations) {
for (i in iss) {
if (i is RequestParam) {
println("參數註解的值:${i?.name},${i?.value}")
}
}
}
}
//-------------------------------測試---------------------------------------
fun main() {
getClassAnnotaion()
getFieldAnnotaion()
getFunctionAnnotaion()
getParameterAnnotaion()
}
Java的註解使用方式參照:https://www.jianshu.com/p/13991ec28dd3
獲取方法參數註解的值,不指定方法名:
//獲取方法參數上註解的值,不指定具體方法
fun getParameterAnnotaion2() {
val clazz = UserRequest::class.java
for (method in clazz.declaredMethods) {
val parameterAnnotations = method.parameterAnnotations
for (iss in parameterAnnotations) {
for (i in iss) {
print("方法名:${method.name}")
if (i is RequestParam) {
println("參數註解的值:${i?.name},${i?.value}")
}
}
}
}
}